我有一个模型,看起来像这样:
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]
答案 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()
,并使用反向网址显示您要显示的模板。