我想根据多个标准对某个内容进行评分。
想象一下这种模型:
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()
用户有一个显示内容的页面。
在此页面上,他还可以根据设置的标准对内容进行评分
评级将通过 Ajax 完成。
现在我正在尝试实现 View 和模板
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 部分)
最佳答案
不确定表单集在这里的意义是什么。所有费率均可通过 criteria
对象获得,使用 ContRate
的反向外键,方式与您在 Criteria
中所做的完全相同到内容
。
为了使其尽可能高效,您可能希望在 View 中获取相关评级并将它们组合到一个数据结构中:
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
。
(最后一点:“criteria”是复数,单数是“criterion”。:-)
关于python - Django - 评级系统 View 和模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8533461/