2010-08-31 13 views
7

¿Cuál es la mejor manera de manejar formularios múltiples? Quiero combinar varias formas en una. Por ejemplo, quiero combinar ImangeFormSet y EntryForm en una sola forma:Django fábrica de formularios múltiples

class ImageForm(forms.Form): 
    image = forms.ImageField() 
ImageFormSet = formset_factory(ImageForm) 

class EntryForm(forms.Form): 
    title = forms.CharField(max_length=100) 

result_form = combine(EntryForm, ImageFormSet) # here it goes 

me encontré con 2 años de edad presentación introduciendo método multipleform_factory(), pero no estoy seguro de que es la mejor manera: http://www.slideshare.net/kingkilr/forms-getting-your-moneys-worth

+0

¿Por qué se necesitan combinarse? –

+0

Puedo procesar cada formulario por separado, pero parece ser más fácil trabajar con un formulario en lugar de dos, tres ... Hay algunos puntos en la presentación (es muy breve y no puedo decir nada mejor). –

Respuesta

4

Un idea (no se comprueba si funciona):

class MySuperForm(CombinedForm): 
    includes = (ImageForm, EntryForm,) 

Usted see here cómo se construye la forma. Puede crear su propio Formulario extendiéndose desde BaseForm y suministrando otro __metaclass__.

class CombinedForm(BaseForm): 
    __metaclass__ = DeclarativeFieldsMetaclassFromMultipleClasses 

En DeclarativeFieldsMetaclassFromMultipleClasses que hacen básicamente lo mismo que here, excepto usted resume los campos declarados de las clases en

class DeclarativeFieldsMetaclassFromMultipleClasses(type): 
    def __new__(cls, name, bases, attrs): 
    for clazz in attrs['includes']: 
     attrs['base_fields'] += get_declared_fields(bases, clazz.attrs) 
    new_class = super(DeclarativeFieldsMetaclassFromMultipleClasses,cls).__new__(cls, name, bases, attrs) 
    if 'media' not in attrs: 
     new_class.media = media_property(new_class) 
    return new_class 
3

No importa cuántas formas se coloca en la plantilla, porque individuo los formularios no representan la etiqueta del formulario. Así, la plantilla es la siguiente

<form id='xxxx' action='' method=POST> 
    {{my_first_formset}} 
    {{my_second_form}} 
</form> 

y en view.py

my_formset = MyFormset(request.POST) 
my_form = MyForm(request.POST) 
if my_formset.is_valid() and my_form.is_valid(): 
    process... 
Cuestiones relacionadas