1

我有一个模型,看起来像这样:

class Topic(models.Model):
    name = models.CharField(max_length=50)

class Vote(models.Model):
    user = models.ForeignKey(User, related_name='user_set')
    topic = models.ForeignKey(Topic, related_name='topic_set')
    score = models.IntegerField(default=0)

    class Meta:
        unique_together = ("user", "topic")

在我的索引视图中,我想显示所有主题的列表。如果用户已经对该主题进行了投票,它应该显示他的分数。如果用户没有投票,它应该显示一个表单供用户投票。

我已经用这个方法扩展了模型作为Topic类的一部分:

def user_has_already_voted(self, user):
    if not Vote.objects.filter(topic=self.id,user=user.id):
        return True
    else:
        return False

但是我不知道这是否是 Django 的方式,因为我不知道如何使用相应的模板编写视图来执行此任务。截至目前,我使用的是通用IndexView的,如下所示:

class IndexView(generic.ListView):
    template_name = 'topics/index.html'
    context_object_name = 'latest_topic_list'

    def get_queryset(self):
        return Topic.objects.order_by('-pub_date')[:5]
4

3 回答 3

2

使用上下文。在视图中添加:

    def get_context_data(self, **kwargs):
        context = {
            'is_voted' : self.user_has_already_voted(self.request.user),
        }
        context.update(kwargs)
        return super(IndexView, self).get_context_data(**context)

并在模板使用中:

{% if is_voted %}
     Show vote results
{% else %}
     Show vote form
{% endif %}
于 2013-10-19T14:56:05.313 回答
1

您可以在模板中访问您的 user_has_already_voted:

{% if topic.user_has_already_voted %}
Show vote results
{% else %}
Show vote form
{% endif %}
于 2013-10-19T09:46:06.573 回答
0

您可以使用 aRedirectView来实现:

在你的views.py中,做这样的事情(这是我在当前项目中使用的代码,这个想法非常相似。

class AbstimmungRedirectView(generic.RedirectView):

    def get_redirect_url(self, pk):
        abstimmung = get_object_or_404(Abstimmung, pk=pk)     
        if abstimmung.abgeschlossen(): 
            #Die Abstimmung wurde durch Angabe eines Enddatms als "Beendet" markiert
            return reverse('my_app:MultipleChoiceFrageResults', args=(int(pk),))
        else:
            return reverse('my_app:MultipleChoiceFrageDetail', args=(int(pk),))

你应该用你的替换我abstimmung.abgeschlossen()has_voted()并使用你想要显示的模板的反向 url。

于 2013-10-19T18:52:34.520 回答