Django:从相关经理那里获取单个元素

时间:2014-10-13 06:40:36

标签: python django django-models django-templates django-views

我有一个应用程序,用户可以在“帖子”上“投票”。在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")

谢谢!

2 个答案:

答案 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 %}