将字段从ModelForm复制到表单中

时间:2011-11-21 07:48:30

标签: python django django-models django-forms

我有一个看似像的虚拟表格:

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。这是一个简单的从一种形式到另一种形式的字段复制,但我有点迷失它。

由于

2 个答案:

答案 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/')
    ...