Django - Пример модели рейтинга Детализировать шаблон - PullRequest
0 голосов
/ 17 июня 2011

Вот контекст: у меня есть пользователи, видео, темы, критерии и оценки

  • У видео есть тема
  • В теме есть критерии
  • AПользователь может создать видео для данной темы
  • Пользователь может оценить видео по критериям, указанным для соответствующей темы.

Вот моя модель для этой цели:

RATE_CHOICES = zip( range(1,5), range(1,5) )

class VideoCrit(models.Model):
  """Criteria to rate videos on.
  Can be multiple for each Topic of Video"""
  name = models.CharField(max_length=50)
  def __unicode__(self):
    return self.name
  class Meta:
    verbose_name = 'Video Criteria'

class VideoTopic(models.Model):
  name = models.CharField(max_length=50)
  descr = models.TextField(blank=True, null=True)
  crits = models.ManyToManyField(VideoCrit,
    help_text='Criterias to rate the videos',
    blank=True, null=True,
  )
  def __unicode__(self):
    return self.name
  class Meta:
    verbose_name = 'Video Topic'

class VideoFile(models.Model):
  """Uploadable by users to be rated and commented"""
  name = models.CharField(max_length=50)
  descr = models.TextField(blank=True, null=True)
  file = models.FileField(upload_to='videos')
  topic = models.ForeignKey(VideoTopic)
  def __unicode__(self):
    return self.name
  class Meta:
    verbose_name = 'Chatter Tube'

class VideoRate(models.Model):
  """Users can Rate each Video on the criterias defined for the topic"""
  user = models.ForeignKey(User)
  video = models.ForeignKey(VideoFile)
  crit = models.ForeignKey(VideoCrit)
  rate = models.DecimalField(max_digits=2, decimal_places=1, choices=RATE_CHOICES)
  class Meta:
    unique_together = (('user', 'video', 'crit'),)
    verbose_name = 'Tube Rating'

Это нормально?

Если да, из шаблона (DetailView на основе класса VideoFile) для данного VideoFile, вот интересная часть шаблона

  <div id="rating">
    <ul>
  {% for crit in videofile.topic.crits.all %}
      <li>
        <div class="rateit"
          crit-id="{{ crit.id }}"></div>
        {{ crit.name }}
      </li>
  {% endfor %}
    </ul>
  </div>

URLconf & View

#urlconf
#...
  (r'viewtube/(?P<pk>\d+)$', VideoFileDetailView.as_view()),
#...

#view
class VideoFileDetailView(DetailView):
  model = VideoFile
  def get_context_data(self, **kwargs):
    context = super(VideoFileDetailView, self).get_context_data(**kwargs)
#    context['rates'] = VideoRate.objects.filter(video=11)
    return context

Как получить доступ к рейтингам текущего зарегистрированного пользователя для текущего видео?

Ответы [ 2 ]

1 голос
/ 17 июня 2011

ОБНОВЛЕНИЕ: чтобы получить все оценки для текущего вошедшего в систему пользователя для текущего видео

# in Views.py 

video = VideoFile.objects.get(pk=video_id) #video_id is parameter sent from url
user_ratings = VideoRate.objects.filter(user=request.user).filter(video=video)

# in template
<ul>
{% for rating in user_ratings %}
    <li>{{ rating.crit.name }}: {{ rating.rate }}</li>
{% endfor %}
</ul>

ПРЕДЫДУЩАЯ:

Вы должны иметь доступ к оценкам вошедшего в систему пользователя.используя что-то для этого:

user.videorate_set.all

Затем вы можете отобразить все оценки для данного пользователя в вашем шаблоне следующим образом:

{% for rating in user.videorate_set.all %}
    {{ rating.video }} {{ ratings.rate }}
{% endfor %}
0 голосов
/ 22 июня 2011

Django - Общий вид с подклассами - параметры URL дал мне ответ. Я должен добавить тарифы, предварительно отфильтрованные в контекст шаблона.

class VideoFileDetailView(DetailView):
  model = VideoFile

  def get_context_data(self, **kwargs):
    context = super(VideoFileDetailView, self).get_context_data(**kwargs)
    context['rates'] = VideoRate.objects.filter(video=self.object, user=self.request.user)
    return context
...