2010-08-31 8 views
7

Quelle est la meilleure façon de gérer plusieurs formulaires? Je veux combiner plusieurs formes en une seule. Par exemple, je veux combiner ImangeFormSet et EntryForm en une forme:Usine de formes multiples Django

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 

J'ai trouvé 2 ans présentation introduisant la méthode multipleform_factory(), mais je ne suis pas sûr que c'est la meilleure façon: http://www.slideshare.net/kingkilr/forms-getting-your-moneys-worth

+0

Pourquoi doivent-ils être combinés? –

+0

Je peux traiter chaque formulaire séparément, mais il semble plus facile de travailler avec un formulaire au lieu de deux, trois ... Il y a quelques points à la présentation (c'est vraiment court et je ne peux pas dire mieux). –

Répondre

4

Une idée (pas vérifié si cela fonctionne):

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

Vous see here comment la forme est construite. Vous pouvez créer votre propre formulaire en partant de BaseForm et en fournissant un autre __metaclass__.

class CombinedForm(BaseForm): 
    __metaclass__ = DeclarativeFieldsMetaclassFromMultipleClasses 

Dans DeclarativeFieldsMetaclassFromMultipleClasses vous faites essentiellement les mêmes que here, sauf que vous résumez les champs déclarés des classes sur

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

Peu importe combien de formes sont placées dans le modèle, parce que personne les formulaires ne rendent pas la balise de formulaire. Donc, votre modèle va comme ceci

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

et view.py

my_formset = MyFormset(request.POST) 
my_form = MyForm(request.POST) 
if my_formset.is_valid() and my_form.is_valid(): 
    process... 
Questions connexes