2011-10-07 43 views
1

이 모델을 고려하십시오. Exercise Django - 현재 사용자보기에서 객체 준비

class Exercise(models.Model): 
    name = models.CharField(max_length=50) 
    def __unicode__(self): 
    return self.name 

class Score(models.Model): 
    """Scores of users by exercise""" 
    exo = models.ForeignKey(Exercise) 
    user = models.ForeignKey(User) 
    score = models.IntegerField() 
    class Meta: 
    unique_together = (('exo', 'user',),) 

Exercise을 표시하는 템플릿이 있습니다.

<ul> 
    {% for exo in exos %} 
    <li>{{ exo }}</li> 
    {% endfor %} 
</ul> 

def view_exos(request): 
    """Lists Exercises""" 
    objs = { 
    'exos': Exercise.objects.all(), 
    } 
    return render_to_response('content/contents.html', objs 
    , context_instance=RequestContext(request) 
) 

이제 Exercise (있는 경우) 앞에서 현재 사용자의 Score을 표시하여 템플릿에서 액세스 할 수 있습니다. 이런 식으로 :

<li>{{ exo }} - {{ exo.user_score }}</li> 

답변

1

내가 할 수있는 것은 모든 사용자의 현재 점수를 앞당기 고 점수를 매기기 사전 매핑 운동을 생성 한 다음 점수를 각 운동의 속성으로 추가하는 것입니다. 같은 뭔가 :

user_scores = request.user.score_set.all() 
score_dict = dict((sc.exo_id, sc.score) for sc in user_scores) 
exos = Exercise.objects.all() 
for ex in exos: 
    ex.current_user_score = score_dict.get(ex.id) 

지금 exos의 각 운동은 그 운동 (또는 없음)에 대한 현재 사용자의 점수입니다 current_user_score 속성을 가지고 있습니다.

+0

Working fine, thanks –

+1

왜'User.score_set.all()'인가? 그 대신에 사용자 인스턴스 여야한다고 생각합니다. –

+0

예, 미안 해요, 'request.user ...'- 변경되었습니다. –

0

아마 당신은 당신의 Exercise에 속성을 추가 할 수 있습니다

class Exercise(models.Model): 
    name = models.CharField(max_length=50) 

    def __unicode__(self): 
     return self.name 

    def user_score(self): 
     return Score.objects.get(exo=self).score 
+0

이 모든 사용자 나에게 점수를 가져올 것 아닌가요? –

+0

네, 맞습니다. –

1

django.contrib.authuser 변수를 템플릿 컨텍스트에 추가하여 현재 사용자를 참조합니다. 이렇게하면 현재 사용자에 대한 모든 점수를 얻을 수있게되며 특정 운동에 대한 점수를 반환하는 템플릿 필터를 만들 수 있습니다.

templatetags 패키지 내의 exercises.py 파일에 있습니다.

[앱 중 하나의 폴더에 패키지를 INSTALLED_APPS에 넣으세요. templatetags은 유효한 Python 패키지 여야합니다. 즉. 템플릿에 __init__.py]

from django.template import Library 
register = Library() 

@register.filter 
def score_for_exercise(scores, exercise): 
    s = scores.filter(exo=exercise) 
    if s: 
     return s[0].score 
    return None 

로 :

{% load exercises %} 
{% with user.score_set.all as user_scores %} 
<ul> 
    {% for exo in exos %} 
    {% with user_scores|score_for_exercise:exo as score %} 
    <li>{{ exo }}{% if score %} - {{score}}{% endif %}</li> 
    {% endwith %} 
    {% endfor %} 
</ul> 
{% endwith %} 
+0

자세한 답변 해 주셔서 감사합니다. 실제로 Roseman의 뷰 기술을 사용하여 템플릿 필터를 만들지 않아도됩니다. –

관련 문제