我找到了附加到特定Upvote
的{{1}}模型实例的列表,因此我可以检查当前用户是否已经对该问题进行了投票。如果用户已经对这个特定问题进行了投票,我想显示一个不同的按钮。问题是,当前question
标签不起作用,因为一个问题可以有许多赞成。我只需要使用{% if .. %}
标记来查看是否有{% if ..%}
。
我如何处理这种情况?我正在寻找不同的解决方案,例如创建变量并在找到匹配项时将其设置为True(似乎很难),或者编写自定义模板标记。我觉得我过度复杂了这个问题。
HTML模板
upvote.user == request.user
models.py
{% for question in questions %}
{% for upvote in question.upvote_set.all %}
{% if upvote.user == request.user %}
# Display the upvote button
{% else %}
# Display a different button
{% endif %}
{% endfor %}
答案 0 :(得分:1)
Django模板布尔表达式支持in
运算符,但我认为你不能将FK关系变得足够简单,只需用模板语法来查询它。
你可以:
a)向Question
模型添加方法以返回upvoting用户列表:
def upvoters(self):
return self.upvote_set.all().values_list('user', flat=True)
然后在模板中测试:
{% if request.user in question.upvoters %}
或b)在视图中注释问题实例:
# assuming questions is a queryset, I think the for loop means this is redundant but I'm including it for clarity
questions = list(questions)
# then modify the model instances
for question in questions:
question.is_upvoted = question.upvote_set.filter(user=request.user).exists()
然后检查模板中的{% if question.is_upvoted %}
。
密切关注其中任何一项的表现,对于相当少量的问题和赞助者来说,这些应该没问题,但是没有特别优化。使用conditional expression的注释可能更有效,但不在我的直接经验之内。