我有一个应用程序,用户可以在“帖子”上“投票”。在UI(模板)中,我想指出用户是否已经投票。这将需要做这样的事情(这不起作用)。在模板中是否有合法的方法(不重写视图)?
我正在努力让所有投票的用户都参与其中。这显然无法正常工作或有意义,但希望它可以传达我想要实现的目标:
{% if user in post.post_votes.all.the_user %}
模型的相关部分:
class Post(models.Model):
content = models.TextField(blank=False)
class Vote(models.Model):
the_user = models.ForeignKey(User, related_name="post_votes")
the_post = models.ForeignKey("Post", related_name="post_votes")
谢谢!
答案 0 :(得分:4)
您需要将用户传递给queryset过滤器。但是内置的模板语法无法做到这一点。所以你应该create your own。
# app.templatetags.app_tags
from django import template
register = template.Library()
@register.filter
def has_voted(user, post):
return post.votes.filter(the_user=user).exists()
# template
{% load app_tags %}
{% if user|has_voted:post %}
<b>Already voted</b>
{% endif %}
另外,你可以循环查询投票组,但这不是一个好主意。
答案 1 :(得分:1)
在Vote
字段the_user
中,related_name
定义为post_votes
。我首先尝试的是修复这是模板(使用post.votes....
代替post.post_votes....
。
至于主要问题,我会在Post
实体内建立一个方法来返回所有选民 - 例如:
@property
def voters(self):
votes = self.post_votes.all()
return set([vote.the_user for vote in votes])
在此之后,我可以在模板中使用:{% if user in post.voters %}
。