Django - рейтинг системы и шаблон - PullRequest
1 голос
/ 16 декабря 2011

У меня есть контент, который я хотел бы оценить по нескольким критериям.
Представьте себе модель такого типа:

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 Ответ

1 голос
/ 16 декабря 2011

Не уверен, в чем здесь смысл набора форм.Все ставки доступны через объект criteria, используя обратный внешний ключ к ContRate точно так же, как вы делали это с Criteria до 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 для каждого.

(Конечная точка: «критерии» - множественное число, единственное число - «критерий».: -)

...