1

我有一个内容,我想根据多个标准对其进行评分。
想象一下这种模型:

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 完成。
现在我正在尝试实现视图和模板

视图.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 部分)

4

1 回答 1

1

不确定表单集的意义在这里。费率都可以通过criteria对象获得,使用反向外键 toContRate与您所做的方式完全相同 from Criteriato Content

为了尽可能提高效率,您可能希望在视图中获取相关评级并将它们组合到一个数据结构中:

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

于 2011-12-16T11:42:56.427 回答