2011-12-16 63 views
1

我有一個內容要對多個條件進行評分。
想象這樣一種模式:Django - 評分系統視圖和模板

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

class Criterion(models.Model): 
    name = models.CharField(max_length=50) 
    content = models.ForeignKey(Content) 

class ContRate(models.Model): 
    user = models.ForeignKey(User, help_text="Who rated ?") 
    crit = models.ForeignKey(Criterion) 
    rate = models.DecimalField() 

用戶具有顯示內容的頁面。
在此頁面中,他還可以在評分標準的內容設置

Rating Criteria

該評級將使用Ajax來完成。
現在我想實現

view.py

#... 
def viewcont(request, content_id): 
    """The user can view a content & rate it""" 
    content = get_object_or_404(Content, pk=content_id) 
    RateFormSet = modelformset_factory(ContRate) 
    formset = RateFormSet(queryset=ContRate.objects.filter(content=content, user=request.user)) 
    objs = { 
    'content': content, 
    'forms': formset, 
    } 
    return render_to_response('content/content_detail.html', objs 
    , context_instance=RequestContext(request) 
) 
#... 

content_detail.html

<!-- ... --> 
<div id="rating"> 
    <ul> 
{% for crit in content.crit_set.all %} 
    <li> 
     {{ crit }} 
     <div class="rateit" 
     data-rateit-value="the_actual_rating_if_already_there" 
     data-rateit-ispreset="true" 
     crit-id="{{ crit.id }}"></div> 
    </li> 
{% endfor %} 
    </ul> 
</div> 
<!-- ... --> 

現在,我怎麼使用forms表單集視圖&模板顯示實際費率?
如何從任何點擊的星形繪製一個由Ajax發佈的空表單?
(我知道javascript/jQuery部分)

回答

1

不確定formset的點在這裏。所有費率均可通過criteria對象獲得,使用與ContRate相反的外部關鍵碼,方法與您從CriteriaContent完成的方式完全相同。

爲了使這個儘可能高效,你可能想在視圖中的相關評級,並把它們連成一個單一的數據結構:

content = get_object_or_404(Content, pk=content_id) 
criteria = content.criteria_set.all() 
user_ratings = ContRate.objects.filter(content=content, user=request.user) 
ratings_dict = dict((c.crit_id, c.rate) for c in user_ratings) 
for crit in criteria: 
    crit.user_rating = ratings_dict.get(crit.id) 

現在你可以直接通過criteria到您的模板,在那裏你可以遍歷它來顯示每個人的user_rating

(最後一點:「標準」是複數,單數爲「標準」 :-)

+0

我想至少爲Ajax職位所有條件的__ModelForm__的。謝謝你的「標準」我不知道:) – 2011-12-16 12:58:05