Django - 循环遍历模板中的列表以检查值是否存在,稍后显示

时间:2017-11-17 22:30:01

标签: django

我找到了附加到特定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 %}

1 个答案:

答案 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的注释可能更有效,但不在我的直接经验之内。