我需要檢查用戶是否喜歡顯示所有帖子的頁面上的帖子,我在下面傳遞帖子和用戶的喜歡
def index(request):
if request.method == "POST":
text = request.POST["post-text"]
Post.objects.create(
entity = Entity.objects.create(
user = request.user,
text = text
)
)
return HttpResponseRedirect(reverse("index"))
return render(request, "network/index.html", {
"posts" : Post.objects.all().order_by('-entity__date', '-entity__id'),
"likes" : Like.objects.filter(user = request.user)
})
這是模型
class Entity(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="posts")
text = models.TextField()
date = models.DateTimeField(default=datetime.now())
class Like(models.Model):
entity = models.ForeignKey(Entity, on_delete=models.CASCADE, related_name="likes")
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="likes")
class Post(models.Model):
entity = models.ForeignKey(Entity, on_delete=models.CASCADE, related_name="post")
模板:
{% for post in posts %}
<div>
<div>{{post.entity.user}}</div>
<div>{{post.entity.text}}</div>
<div>{{post.entity.date}}</div>
<div class="like-btn d-inline" data-id="{{post.entity.id}}">
{% if post.entity in likes %}
<p>yes</p>
{%else%}
<p>no</p>
{%endif%}
<div class="d-inline">{{post.entity.likes.count}}</div>
</div>
<br />
<a href="#">Comment</a>
<hr />
</div>
{% endfor %}
我不知道如何寫 if 條件,我試過這個 {% if post.entity in likes %} 但它不起作用。非常感謝任何幫助我有點卡住了
uj5u.com熱心網友回復:
請不要。雖然這可以在這種情況下完成,但它會導致很多額外的查詢。您可以使用Exists子查詢 [Django-doc]:
from django.contrib.auth.decorators import login_required
from django.db.models import Exists, OuterRef
from django.shortcuts import redirect
@login_required
def index(request):
if request.method == 'POST':
text = request.POST['post-text']
Post.objects.create(
entity = Entity.objects.create(
user = request.user,
text = text
)
)
return redirect('index')
posts = Post.objects.annotate(
is_liked=Exists(
Like.objects.filter(user=request.user, entity_id=OuterRef('entity_id')
)
).select_related('entity').order_by('-entity__date', '-entity__id')
return render(request, "network/index.html", {
'posts' : posts
})
然后,這些Post物件將具有一個額外的屬性.is_liked,即登錄用戶是否喜歡該True屬性。Post
注意:您可以使用
@login_required裝飾器 [Django-doc]將視圖限制為經過身份驗證的用戶的視圖 。
注意:您可以使用[Django-doc]而不是首先呼叫[Django]然后將其包裝在物件 [Django-doc]中。該函式不僅提供了更方便的簽名來執行此操作,例如, 如果您將模型物件傳遞給它,它還將使用方法 [Django-doc] 。
redirect(…)reverse(…)HttpResponseRedirectredirect(…).get_absolute_url()
注意:通常使用[Django-doc]參考用戶模型比直接使用模型 [Django-doc]更好。有關更多資訊,您可以查看檔案的參考模型部分。
settings.AUTH_USER_MODELUserUser
注意:Django 的[Django-doc] 有一個引數 [Django-doc] 用于處理時間戳。這將在創建物件時自動分配當前日期時間,并將其標記為不可編輯(),使其默認不會出現在 s 中。
DateTimeFieldauto_now_add=…editable=FalseModelForm
uj5u.com熱心網友回復:
我認為在視圖中執行對物體/喜歡/用戶進行排序的邏輯,然后將格式正確的資料傳遞給模板更容易。
這是一個很好的做法,因為您很快就會想要對資料執行更困難的轉換,這在 django 模板中即使不是不可能也非常困難。這也是為什么這種邏輯屬于視圖內部的原因。
我希望這可以幫助你!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/497989.html
下一篇:如何從后端傳達完成百分比到前端
