我有一个看似像的虚拟表格:
class MyForm(forms.Form):
class __init__(self, *args, **kwargs):
pass
以下是ModelForms及其各自的模型:
class Person(models.Model):
fname = models.CharField(max_length = 255)
lname = models.CharField(max_length = 255)
class Address(models.Model):
address = models.CharField(max_length = 255)
person = models.ForeignKey(Person)
class PersonForm(ModelForm):
class Meta:
model = Person
class AddressForm(ModelForm):
class Meta:
model = Address
我想像MyForm
这样发起myfrm = MyForm(PersonForm, AddressForm)
。
如何将每个表单的字段动态添加到MyForm
,不包括AutoFields和ForeignKey字段,例如MyForm
在启动时最终会有三个字段 - fname
,{{ 1}}和lname
。这是一个简单的从一种形式到另一种形式的字段复制,但我有点迷失它。
由于
答案 0 :(得分:2)
考虑到上面的模型,只是添加一个字段是不正确的。
Address
与Person有ManyToOne
关系 - 用户可以拥有多个地址。在这种情况下,最好看一下django的内联表单集:
https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#using-an-inline-formset-in-a-view
很麻烦,但你也可以手动将CharField
添加到Person的ModelForm
,覆盖它的保存并处理将该字段的内容保存到Address
(丑陋,我不知道喜欢它。)
答案 1 :(得分:0)
您可以使用prefix
参数将两个表单放在一个html <form>
标记内。然后,您在视图中进行一些工作,将地址链接到此人。
def my_view(request):
if request.method == "POST":
person_form = PersonForm(data=request.POST, prefix="person")
address_form = AddressForm(data=request.POST, prefix="address")
if person_form.is_valid() and address_form.is_valid():
person = person.save()
address = address.save(commit=False)
address.person = person
address.save()
return HttpResponseRedirect('/success-url/')
...