Django:Unused';v_item.pk和x27;在if表达式的末尾

Django:Unused';v_item.pk和x27;在if表达式的末尾,django,templatetags,Django,Templatetags,如果ID已经存在于其他表中,我将尝试隐藏一个按钮。 我的模板中有一个确认按钮,用于确认订单,它将确认的订单保存在一个名为(ConfirmOrder)的表中。因此,我想如果订单已经确认,或者订单的id已经存在于确认订单表中,那么确认按钮将被禁用/隐藏,以便我无法再次确认。 我试图使用templatetags,但我发现了这个错误(if表达式末尾未使用的“v_item.pk”) 模型 模板标签 from django import template from ..models import Confi

如果ID已经存在于其他表中,我将尝试隐藏一个按钮。 我的模板中有一个确认按钮,用于确认订单,它将确认的订单保存在一个名为(ConfirmOrder)的表中。因此,我想如果订单已经确认,或者订单的id已经存在于确认订单表中,那么确认按钮将被禁用/隐藏,以便我无法再次确认。 我试图使用templatetags,但我发现了这个错误(if表达式末尾未使用的“v_item.pk”)

模型

模板标签

from django import template
from ..models import ConfirmOrder

register = template.Library()

@register.simple_tag
def check_item_already_exists(request, pk):
    return ConfirmOrder.objects.filter(id=pk, is_active=1).exists()
模板

{% for v_item in viewitem %}
  <tr>
    <td>{{ forloop.counter }}</td>
    <td>{{ v_item.order_no.location }}</td>
    <td>{{ v_item.order_no.order_date }}</td>
    <td>{{ v_item.order_no.supplier }}</td>
    <td>{{ v_item.order_no.order_number }}</td>
    <td>{{ v_item.order_no.pay_ref }}</td>
    <td>{{ v_item.product }}</td>
    <td>{{ v_item.quantity }}</td>
    <td>{{ v_item.buying_price }}</td>
    <td>{{ v_item.amount }}</td>
    <td>
      {% load check_item %}
      {% if not check_item_already_exists v_item.pk %}
      <a class="btn btn-warning btn-sm" href="{% url 'confirm_order' v_item.pk %}"> Confirm </a>
      {% endif %}
    </td>
我哪里做错了?或者我还有其他方法可以做到这一点吗? 有人能帮忙吗

请不要在模板中写入业务逻辑。模板处理呈现逻辑。与业务逻辑无关。Django模板语言被刻意限制,以避免人们在模板中编写大量业务逻辑

在视图中,您可以使用以下选项设置
查询集

from django.db.models import Exists, OuterRef

def confirm_purchase(request):
    viewitem = OrderItem.objects.annotate(
        is_active=Exists(
            ConfirmOrder.objects.filter(is_active=1, pk=OuterRef('pk'))
        )
    )
    return render(request, 'managepurchase/confirmed_purchase.html', {'viewitem': viewitem})
从django.db.models导入存在,OuterRef def确认_购买(请求): viewitem=OrderItem.objects.annotate( 是否激活=存在( ConfirmOrder.objects.filter(is_active=1,pk=OuterRef('pk')) ) ) 返回呈现(请求'managepurchase/confirmed_purchase.html',{'viewitem':viewitem}) 然后,在模板中,我们可以使用以下内容进行渲染:

{% if v_item.is_active %}
    <a class="btn btn-warning btn-sm" href="{% url 'confirm_order' v_item.pk %}"> Confirm </a>
{% endif %}
{%if v_item.is_active%}
{%endif%}
您的行

{% if not check_item_already_exists v_item.pk %}
包含条件的两个部分(
检查项目\u已存在
检查项目.pk
),但只允许一个部分


您无法在Django模板(这是Django中的设计决策)内将参数传递给函数调用,因此您必须找到另一种方法来获取模板中所需的信息,可能是在视图中而不是在模板中调用函数。

您可以共享传递
viewitem
的视图吗,我编辑了问题,所以,我不应该使用模板标签?@EricksonKitoz:不,但你为什么要在这里使用模板标签。根据它的实现,它只是
v_item.is_active
(除了你做一个额外的查询,这会使它变得相当慢)。如果你需要更复杂的东西,最好把它们移到视图层。事实上,我是django的新手,我正在尝试一种更好的方法。我试试你的方法。ThanksIf is use v_item.is_active我必须创建一个视图吗?@EricksonKitoz:不,因为它只是模型的一个字段,您只需在这里编写
{%if v_item.is_active%}
{% if v_item.is_active %}
    <a class="btn btn-warning btn-sm" href="{% url 'confirm_order' v_item.pk %}"> Confirm </a>
{% endif %}
{% if not check_item_already_exists v_item.pk %}