Django - 评级系统视图&模板

时间:2011-12-16 11:20:54

标签: python django django-forms rating-system

我有一个内容,我想根据多个标准评分 想象一下这种模式:

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 formset显示实际费率?
我如何从任何点击过的星上画出一个由Ajax发布的空表格?
(我知道javascript / jQuery部分)

1 个答案:

答案 0 :(得分: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

(最后一点:“标准”是复数,单数是“标准”。: - )