2017-11-17 34 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