【问题标题】:How to filter data in get_context_data如何过滤 get_context_data 中的数据
【发布时间】:2026-01-17 15:00:01
【问题描述】:

我有 2 个模型 ...

class PurchaseOrder(models.Model):
    po_number = models.IntegerField(unique=True, default=get_po_number)
    po_date = models.DateField()
    invoice_number = models.ForeignKey(Invoice, on_delete=models.CASCADE)

class PurchaseOrderItem(models.Model):
    po_number_fk = models.ForeignKey(PurchaseOrder, on_delete=models.CASCADE)
    qty = models.IntegerField()
    unit = models.CharField(max_length=100, blank=True, null=True)
    description = models.CharField(max_length=255)
    unit_price = models.DecimalField(max_digits=6, decimal_places=2)
    amount = models.DecimalField(max_digits=6, decimal_places=2)

一个用于采购订单(PurchaseOrder),一个用于特定采购订单中的项目(PurchaseOrderItem)

我正在尝试在一个 TemplateView 中访问两个模型的数据...

class PurchaseOrderDetailView(LoginRequiredMixin, TemplateView):
    template_name = 'financial/purchase_orders/purchase_order_detail.html'

    def get_context_data(self, **kwargs):
        context = super(PurchaseOrderDetailView, self).get_context_data(**kwargs)
        context['purchase_order'] = PurchaseOrder.objects.get()
        context['item'] = PurchaseOrderItem.objects.filter()
        return context

但我不确定如何根据通过 URL 传递的 pk 过滤 purchase_order.pk,也不确定如何根据 purchase_order.pk 过滤 items.po_number_fk。我知道我需要将登录名放入我的 PurchaseOrder.objects.get() 和 PurchaseOrderItem.objects.filter() 但不确定逻辑需要是什么

感谢您提供的任何帮助

【问题讨论】:

    标签: django


    【解决方案1】:

    您应该将user = models.ForeignKey(User, on_delete=models.CASCADE) 添加到您的 PurchaseOrder 模型中,否则您无法过滤用户并且任何登录的用户都可以看到任何其他用户的订单。另外,如果我是你,我会将po_number_fk 重命名为orderpurchase_order,这样会更明显。

    您可以通过self.kwargs['pk'] 引用pk 字段并以这种方式过滤两个模型(如果您执行上述所有操作):

    class PurchaseOrderDetailView(LoginRequiredMixin, TemplateView):
        template_name = 'financial/purchase_orders/purchase_order_detail.html'
    
        def get_context_data(self, **kwargs):
            context = super(PurchaseOrderDetailView, self).get_context_data(**kwargs)
            pk, user = self.kwargs['pk'], self.request.user
            context['purchase_order'] = PurchaseOrder.objects.get(pk=pk, user=user)
            context['item'] = PurchaseOrderItem.objects.filter(order=pk)
            return context
    

    【讨论】:

    • 太好了,谢谢!此外,我实际上确实有 user = models.ForeignKey(settings.AUTH_USER_MODEL) 以及许多其他字段,但我将这些字段排除在我之前的帖子之外。感谢您的帮助,我会采纳您重命名 po_number_fk 的建议
    • 如何将 django-filter 包应用到上下文字典中? *.com/questions/61973937/…