gpt4 book ai didi

Django ModelForm 继承、子类化和传入实例

转载 作者:行者123 更新时间:2023-12-02 03:51:42 26 4
gpt4 key购买 nike

我有一个地址模型:

class Address(models.Model):
line1 = models.CharField(max_length=100)
....

和地址表单:

class AddressForm(forms.ModelForm):
class Meta:
model = Address

一些模型将有一个地址字段,因此我不想复制+粘贴 AddressForm 中的所有字段,而是想扩展 AddressForm 以便可以重用它。具体来说,我想避免将所有表单字段复制+粘贴到其他应用程序的表单中,并且只有一个 AddressForm.is_valid() 函数。

例如,订单将有一个地址,所以我的计划是这样做:

class Order:
address = models.ForeignKey(Address, on_delete=models.CASCADE)

class OrderForm(AddressForm):
class Meta:
model = Order

但是,当我从 order/views.py 向 OrderForm 传递一个实例时,我传递的是 Order 的实例,并且所有 AddressForm 字段都显示为空白:

form = OrderForm(instance=order)

如何从 order.address 字段初始化 AddressForm 字段?

我试过这个:

class OrderForm(AddressForm):
def __init__(self, *args, **kwargs):
kwargs['instance'] = kwargs['instance'].address
super(OrderForm, self).__init__(*args, **kwargs)

但是这不起作用。

有办法做到这一点吗?或者重用 AddressForm 的更好方法?或者只有当 Order 是 Address 的子类时这才有效?

干杯,

最佳答案

如果您不想子类化 Address,那么您应该在 View 中使用两个表单,而不是尝试在订单表单中包含地址字段。

if request.method = "POST":
address_form = AddressForm(request.POST, instance=order.address)
order_form = OrderForm(request.POST, instance=order)
if address_form.is_valid() and order_form.is_valid():
address = address_form.save()
order = order_form.save()

您的订单表格应排除地址的外键。

class OrderForm(AddressForm):
class Meta:
model = Order
exclude = ['address']

当您创建新实例时,您应该使用 commit=False 保存订单,设置地址,然后保存订单:

if request.method = "POST":
address_form = AddressForm(request.POST)
order_form = OrderForm(request.POST)
if address_form.is_valid() and order_form.is_valid():
address = address_form.save()
order = order_form.save(commit=False)
order.address = address
order.save()

关于Django ModelForm 继承、子类化和传入实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45213700/

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