2011-12-16 105 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