Копирование полей из ModelForm в форму - PullRequest
0 голосов
/ 21 ноября 2011

У меня есть фиктивная форма, которая выглядит следующим образом:

class MyForm(forms.Form):

    class __init__(self, *args, **kwargs):
        pass

Вот модели моделей и их соответствующие модели:

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, lname и address.Это простое копирование полей из одной формы в другую, но я немного растерялся.

Спасибо

Ответы [ 2 ]

2 голосов
/ 21 ноября 2011

Просто добавление поля не является правильным, учитывая модели выше.

Address имеет отношение ManyToOne к человеку - у пользователя может быть несколько адресов. В этом случае лучше взглянуть на наборы встроенных форм django:

https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#using-an-inline-formset-in-a-view

Обременительно, но Вы также можете вручную добавить CharField к Person's ModelForm, переопределить его сохранение и обработать сохранение содержимого этого поля в Address (уродливо, мне это не нравится).

0 голосов
/ 21 ноября 2011

Вы можете поместить обе формы в один тег html <form>, используя аргумент prefix.Затем вы выполняете небольшую работу в представлении, чтобы связать адрес с человеком.

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