gpt4 book ai didi

Django:从 ModelAdmin 中访问模型实例?

转载 作者:行者123 更新时间:2023-11-28 19:34:52 26 4
gpt4 key购买 nike

我在网上商店应用程序中有一个订单模型,它有一个自动递增的主键和一个指向自身的外键,因为订单可以拆分为多个订单,但必须保持与原始订单的关系。

class Order(models.Model):
ordernumber = models.AutoField(primary_key=True)
parent_order = models.ForeignKey('self', null=True, blank=True, related_name='child_orders')
# .. other fields not relevant here

我已经为管理站点注册了一个 OrderAdmin 类。对于详细 View ,我在 fieldsets 属性中包含了 parent_order。当然,默认情况下,这会在一个选择框中列出所有订单,但这不是我们想要的行为。相反,对于没有父订单的订单(即尚未从另一个订单拆分;parent_order 为 NULL/None),不应显示任何订单。对于已拆分的订单,这应该只显示单个父订单。

有一个相当新的 ModelAdmin 方法可用,formfield_for_foreignkey,它似乎非常适合这个,因为可以在其中过滤查询集。假设我们正在查看订单 #11234 的详细 View ,它已从订单 #11208 中分离出来。代码如下

def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == 'parent_order':
# kwargs["queryset"] = Order.objects.filter(child_orders__ordernumber__exact=11234)
return db_field.formfield(**kwargs)
return super(OrderAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

注释行在 Python shell 中运行时有效,返回一个单项查询集,其中包含订单 #11208 和 #11234 以及可能从中拆分出来的所有其他订单。

当然,我们不能在那里硬编码订单号。我们需要引用我们正在查看其详细信息页面的订单实例的 ordernumber 字段。像这样:

kwargs["queryset"] = Order.objects.filter(child_orders__ordernumber__exact=?????)

我找不到替代 ?????? 的有效方法引用“当前”订单实例,我已经挖得很深了。 formfield_for_foreignkey 中的 self 指的是 ModelAdmin 实例,虽然它确实有一个 model 属性,但它不是订单模型实例(它是一个 ModelBase 引用; self.model() 返回一个实例,但它的订单号是 None)。

一个解决方案可能是从 request.path (/admin/orders/order/11234/) 中提取订单号,但这真的很难看。我真的希望有更好的方法。

最佳答案

我认为您可能需要以稍微不同的方式处理此问题 - 通过修改 ModelForm,而不是管理类。像这样:

class OrderForm(forms.ModelForm):

def __init__(self, *args, **kwargs):
super(OrderForm, self).__init__(*args, **kwargs)
self.fields['parent_order'].queryset = Order.objects.filter(
child_orders__ordernumber__exact=self.instance.pk)

class OrderAdmin(admin.ModelAdmin):
form = OrderForm

关于Django:从 ModelAdmin 中访问模型实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/949268/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com