我有一个Article
模型,我从用户成功登录时获取该模型:
articles = Article.objects.all()
我还有Likes
模型,其中有user_id
和article_id
来记录用户喜欢的文章。
articles_liked = Likes.objects.values_list('article_id', flat = True)
users_who_liked = Likes.objects.values_list('user_id', flat = True)
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
语句会为所有文章和{{1}返回True
阻止永远不会被执行。
我怎样才能以正确的方式做到这一点?
答案 0 :(得分:1)
您的变量articles_liked
和users_who_liked
彼此不相关。它们始终包含所有喜欢的文章和所有喜欢的用户,但在它们之间,您可以依赖的模板上下文中没有任何关系。
因此,对于至少有一个用户喜欢的任何文章的每个用户,您的if
语句将始终返回True
。
从您的问题中假设Like
有一个外键(Django docs)到User
,外键到Article
,您可以在articles_liked
添加一个过滤器1}}赋值仅从当前用户检索喜欢:
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 %}
答案 1 :(得分:0)
由于您的Likes对象具有对用户和文章的引用,为什么不在您的视图中利用它?这样你就可以控制视图中的逻辑,模板就变成了一个简单的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 %}