视图/模板中项目的不同显示取决于Django中的模型

时间:2013-10-19 08:04:55

标签: python django templates

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

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]

3 个答案:

答案 0 :(得分: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 %}

答案 1 :(得分:1)

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

{% if topic.user_has_already_voted %}
Show vote results
{% else %}
Show vote form
{% endif %}

答案 2 :(得分:0)

您可以使用RedirectView来实现此目的:

在你的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(),并使用反向网址显示您要显示的模板。