Django - 评级模型示例 DetailView 模板

Posted

技术标签:

【中文标题】Django - 评级模型示例 DetailView 模板【英文标题】:Django - Rating Model Example DetailView Template 【发布时间】:2011-09-17 07:28:49 【问题描述】:

这里是上下文: 我有用户、视频、主题、标准和评分

视频有主题 主题有标准 用户可以为给定主题创建视频 用户可以根据为相关主题指定的标准对视频进行评分。

这是我的模型:

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'

还好吗?

如果是,来自给定 VideoFile 的模板(基于 VideoFile 类的 DetailView),这里是模板的有趣部分

  <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 和查看

#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

如何查看当前登录用户对当前视频的评分?

【问题讨论】:

对我来说看起来还不错,但它有用吗? 【参考方案1】:

更新:获取当前登录用户对当前视频的所有评分

# 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 %

【讨论】:

抱歉,我更新了我的问题。我想查看当前用户对当前视频的评分。 @Glide 我明白了。如果您只想为当前登录用户的单个视频评分,最好在您的视图中获取这些值,然后将它们作为变量传递给您的模板。您可以发布您的其他模型,尤其是您如何将您的用户模型与其他模型以及您的视图代码连接起来吗?你也可以编写一个自定义模板标签,但这似乎有点过头了。 这是给我该用户所有视频的费率,而不仅仅是当前视频。 @Glide 您是否包括查询的.filter(video=video) 部分?这应该将结果限制为您指定的视频实例。 是的,在我扩展的 DetailView 中,我终于使用了VideoRate.objects.filter(video=self.object, user=self.request.user),我认为可以访问模板中的费率,而无需扩展视图。【参考方案2】:

Django - Generic View Subclassed - url Parameters 给了我答案。我必须将预先过滤的费率添加到模板的上下文中。

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

【讨论】:

以上是关于Django - 评级模型示例 DetailView 模板的主要内容,如果未能解决你的问题,请参考以下文章

为啥不能在 Django ManyToMany 字段上强制执行唯一性?

从两个不同的模型在 Django 中建模收藏夹

Django - 过滤相关对象

评分/评级引擎 - 建议和示例?

自定义 django 管理视图

Django Post 模型视图示例