2017-11-17 79 views
0

我找到了附加到特定questionUpvote模型实例的列表,因此我可以检查当前用户是否已上传问题。我想显示一个不同的按钮,如果用户已经upvoted这个特定的问题。问题是,目前的{% if .. %}标签不起作用,因为一个问题可以有很多upvotes。我只需要{% if ..%}标签即可查看是否其中一个upvote.user == request.userDjango - 循环模板列表以检查值是否存在,稍后显示

我该如何处理这种情况?我正在寻找不同的解决方案,比如创建一个变量,并在发现匹配时将其设置为True(看起来很难),或者编写自定义模板标签。尽管如此,我觉得我过分复杂化了这个问题。


HTML模板

{% 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 %} 

models.py

class Question(models.Model): 
    # ... code 
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='question', null=True, blank=True) 

class Upvote(models.Model): 
    question = models.ForeignKey(Question, on_delete=models.CASCADE, null=True, blank=True) 
    user = models.ForeignKey(User, on_delete=models.CASCADE) 

回答

1

Django的模板布尔表达式支持in运营商,但我不认为你可以拼合FK足以使用模板语法查询它的关系。

你既可以:

一)添加一个方法到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 %}

注意其中任何一个的性能,这些应该罚款合理少量的问题和upvoters,但没有特别优化。注释conditional expression可能更有效,但不在我的直接体验中。

+0

我爱你。我只是设法用你的第一个解决方案来解决它。我们需要将pk添加到'request.user',因为'values_list('user')'返回用户的pk。因此,通过使用'{%if request.user.pk question.upvoters%}',它可以工作!我并不太在意繁重的交通处理工作,所以现在这样做。 – Valachio