如何使用forloop,以便满足循环中的“if”语句时,循环以Django模板结束
我有2个Django模型回顾和我正在处理的项目。我想看看用户是否已经查看了该项目。如果是,他会看到复习分数。如果没有,他会看到查看项目的按钮 我有下面的复习模式如何使用forloop,以便满足循环中的“if”语句时,循环以Django模板结束,django,python-3.x,django-templates,django-views,Django,Python 3.x,Django Templates,Django Views,我有2个Django模型回顾和我正在处理的项目。我想看看用户是否已经查看了该项目。如果是,他会看到复习分数。如果没有,他会看到查看项目的按钮 我有下面的复习模式 class Review (models.Model): review_from = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name='review_from') review_for = models.ForeignK
class Review (models.Model):
review_from = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name='review_from')
review_for = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name='review_for')
item = models.ForeignKey(OrderItem, related_name='items')
在视图上下文伪代码中定义变量
admin = User.objects.get(username="admin")
admins_reviews = Review.objects.filter(review_from__username = "admin")
下面是我的模板
{% for item in buyers_items %}
{% for review in buyers_review%}
{% if review.item.id == item.id %}
<button class="text-success">Your rating<br/><b>{{review.ratings}}/10</b></button>
{% else %}
<a href="{% url ... %}">
<button>Leave Review</button>
</a>
{% endif %}
{% endfor %}
{% endfor %}
自定义标签
@register.filter()
def review_bought_items(order_items, buyers_review):
return buyers_review.filter(item__in=order_items).exists()
问题是,您正在迭代所有买家的评论。在这种特殊情况下,您有两个买家审核,一个针对当前项目,另一个针对不同的项目 第一次迭代将评估为False第一个条件,它将显示所有的Leave Review按钮,第二次迭代将评估为True,并显示Your rating块
如果您不想移动后端上的所有逻辑,可以使用模板标记,以便根据item.id筛选评论。基于我在模板中看到的内容,您可以使用标记过滤器或在视图侧更简单地执行此操作。让我们使用自定义标记:
@register.filter
def review_bought_items(buyers_items,buyers_review):
return buyers_review.filter(item__in=buyers_items).exists()
现在在模板中,您可以执行以下操作
<!-- load the tag -->
{% load file %}
{% if buyers_items|review_bought_items:buyers_review %}
<button class="text-success">Your rating<br/><b>{{review.ratings}}/10</b></button>
{% else %}
<a href="{% url ... %}">Leave Review</a>
{% endif %}
“不清楚你犯了什么错误?”JonClements我编辑了这张图片。我有两个按钮,一个是评论,另一个是离开评论。见上图。因为它们都有评论。所有这些逻辑都必须在后端完成,而不是在模板端。显示您的视图,以便我提供帮助如果您对html模板进行c/p处理,您在{%endif%}标记处有一个输入错误。@Alex我修复了它在实际代码中是正确的我尝试在视图中进行筛选当前我的视图是上下文['Budders\u review']=review.objects.filterreview from=self.request.user我不确定如何筛选项目上下文['Budders\u review']=Review.objects.filterreview_from=self.request.user,item=self.kwargs.getitem不工作我不知道您的完整视图是什么样子,但是,您可以使用“评论”部分中推荐的解决方案,创建一个自定义筛选器并在模板中应用它,而不是比较项目ID。我已根据您的代码编辑了我的视图,请参见上面的问题。您认为正确吗?否@SamirTendulkar不正确,自定义标记应该是一个单独的文件,看一看如何写一个自定义标记我相信它会工作的,只是吃了一顿晚餐休息。我将在定制标签上观看视频,并在明天实施。我非常感谢您回答这个问题。很高兴为您提供帮助!还在做这个。{{review.ratings}}只起作用,因为如果我在代码中添加forloop,{u review%}中的forloop{for review%。我好像回到了原点。我肯定我做错了什么。这是我的个人项目,所以我必须在白天的工作之间完成。希望你能在这方面工作一整晚
<!-- load the tag -->
{% load file %}
{% if buyers_items|review_bought_items:buyers_review %}
<button class="text-success">Your rating<br/><b>{{review.ratings}}/10</b></button>
{% else %}
<a href="{% url ... %}">Leave Review</a>
{% endif %}