2011-10-07 56 views
1

考慮這種模式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) 
) 

現在我想顯示當前用戶的Score在每個Exercise的前面(如果有一個)以這種方式:

<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

工作正常,謝謝 –

+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.auth有一個context processor,它將user變量添加到模板上下文中,引用當前用戶。這可以讓您獲取當前用戶的所有分數,然後您可以創建模板過濾器,以返回特定練習的分數。

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

感謝您的詳細解答。其實我更喜歡使用羅斯曼的視圖技術,這讓我可以避免創建模板過濾器。 –

相關問題