Django - 评分系统视图与模板

1 投票
1 回答
1401 浏览
提问于 2025-04-17 08:30

我有一些内容想要根据多个标准进行评分。
想象一下这样的模型:

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.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 个回答

1

这里的表单集有什么用我不太明白。所有的评分都可以通过 criteria 对象获取,方法和你从 CriteriaContent 的方式完全一样,都是用反向外键去访问 ContRate

为了让这个过程尽可能高效,你可能想在视图中获取相关的评分,然后把它们放到一个数据结构里:

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”。:-)

撰写回答