【问题标题】:Django: Unused 'v_item.pk' at end of if expressionDjango:if表达式末尾未使用的'v_item.pk'
【发布时间】:2020-10-17 21:31:43
【问题描述】:

如果 ID 已存在于其他表中,我会尝试隐藏按钮。 我的模板中有一个确认按钮,用于确认订单,并将确认的订单保存在名为 (ConfirmOrder) 的表中。所以我想如果订单已经确认或者该订单的 ID 已经存在于 ConfirmOrder 表中,确认按钮被禁用/隐藏,以便我无法再次确认。 我尝试使用 templatetags 我得到这个错误(未使用的 'v_item.pk' 在 if 表达式的末尾)

型号

class ConfirmOrder(models.Model):
    order_no = models.ForeignKey(OrderDetail, related_name='confirmorders', on_delete = models.SET_NULL, null=True)
    product = models.ForeignKey(StoreStock, null=True, blank=True, on_delete = models.SET_NULL)
    quantity = models.DecimalField(max_digits = 10, decimal_places = 2, blank=True)
    buying_price = models.DecimalField(max_digits = 10, decimal_places = 2, blank=True)
    amount = models.DecimalField(max_digits = 10, decimal_places = 2, blank=True)
    confirm_note = models.CharField(max_length = 50, blank=True)
    is_active = models.IntegerField(default=1)

模板标签

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>

查看

def confirm_purchase(request):
    viewitem = OrderItem.objects.all()
    return render(request, 'managepurchase/confirmed_purchase.html', {'viewitem': viewitem})

我哪里做错了?还是有其他方法可以做到这一点? 有没有人可以帮忙!

【问题讨论】:

  • 你能分享一下通过viewitem的观点吗?

标签: django templatetags


【解决方案1】:

不要在模板中写业务逻辑。模板处理渲染逻辑。不是 business 逻辑。 Django 模板语言故意受到限制,以避免人们在模板中编写大量业务逻辑。

在视图中你可以.annotate(…) [Django-doc] QuerySet 使用:

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})

然后在模板中我们可以渲染它:

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

【讨论】:

  • 那么,我不应该使用模板标签吗?
  • @EricksonKitoz:不,但你为什么要在这里使用模板标签。根据它的实现,它只是v_item.is_active(除了你做一个额外的查询,这将使它相当慢)。如果你需要更复杂的东西,最好把它们移到视图层。
  • 实际上我是 django 的新手,我正在尝试一种更好的方法。我会试试你的方法。谢谢
  • 如果使用 v_item.is_active 我必须创建一个视图吗?
  • @EricksonKitoz:不,因为它只是模型的一个字段,你可以在这里简单地写{% if v_item.is_active %}
【解决方案2】:

你的线路

{% if not check_item_already_exists v_item.pk %}

包含 2 个部分(check_item_already_existsv_item.pk)的条件,但只允许一个部分。

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

【讨论】:

    猜你喜欢
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 2023-03-05
    相关资源
    最近更新 更多