2014-10-05 23 views
0

我有一個Article模型,我從當用戶成功登錄獲取如果聲明:檢查列表以及在循環使用Python/Django的

articles = Article.objects.all() 

我也有Likes模型,該模型具有user_idarticle_id到記錄用戶喜歡的文章。

​​

article_id給出文章的用戶列表都喜歡,而users_who_liked給誰喜歡這些文章的用戶列表如下圖所示:

articles_liked = [4, 3, 5, 6, 10] 
users_who_liked = [1, 13, 15, 16, 110] 

我想實現的是能夠告訴如果某個特定帖子已被我的模板中登錄的用戶所喜歡,

{% for article in articles %} 
    <p>{{article.content}}</p> 
     {% if this_user_id in users_who_liked and article.id in articles_liked %} 
      <p class = 'likes'> 2 </p> 
     {% else %} 
      <p class = 'likes already_liked'> 2 </p> 
     {% endif %} 
{% endfor %} 

假設this_user_id = 1和他/她喜歡的是4的文章中,if語句的所有文章返回Trueelse塊永遠不會被執行。

我該如何正確地做到這一點?

回答

1

您的變量articles_likedusers_who_liked彼此不相關。他們總是包含全部讚的文章和全部喜歡的用戶,但是他們之間在您的模板環境中沒有關係,您可以依賴。

因此您if語句總是對誰喜歡任何文章已經喜歡通過至少一個用戶每個用戶返回True

從你的問題是Like有一個外鍵(Django docs)到User和外鍵Article只需要添加一個過濾器,你articles_liked分配只檢索當前用戶喜歡假設:

articles_liked = Likes.objects.filter(user_id=this_user_id).values_list('article_id', flat = True) 

然後在你的模板,你可以簡單地檢查當前的文章是在這個名單:

{% for article in articles %} 
    <p>{{article.content}}</p> 

    {% if article.id in articles_liked %} 
     <p class = 'likes'> 2 </p> 
    {% else %} 
     <p class = 'likes already_liked'> 2 </p> 
    {% endif %} 
{% endfor %} 
+0

這做到了!謝謝。 – Yax 2014-10-08 09:16:42

0

隨着你喜歡的對象有這兩個用戶提供一個參考和文章,爲什麼不利用你的觀點呢?你控制的邏輯視圖和模板,這樣,剛剛成爲if語句簡單:現在

def some_view(request): 
    articles = Article.objects.all() 
    user = request.user 
    article_list = [] 
    for a in articles: 
    # Create a tuple, with a flag if the user has liked this article or not. 
    article_status = (Likes.objects.filter(article_id=a.pk, user_id=user.pk).exists(), a,) 
    article_list.append(article_status) 
    return render(request, 'template.html', {'articles': article_list}) 

,在你的模板,你具備以下條件:

{% for liked,article in articles %} 
    {% if liked %} 
     <strong>You already liked this article!</strong> 
    {% endif %} 
    {{ article }} 
{% endfor %}