2010-08-31 26 views
7

Birden çok formla baş etmenin en iyi yolu nedir? Birkaç formu bir arada birleştirmek istiyorum. Mesela ben bir forma ImangeFormSet ve EntryForm birleştirmek istiyorum: Ben multipleform_factory() yöntemini tanıtan 2 yaşında bir sunum bulunduDjango çoklu form fabrika

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 

, ama en iyi yol olduğundan emin değilim: http://www.slideshare.net/kingkilr/forms-getting-your-moneys-worth

+0

Neden kombine edilmesi gerekiyor? –

+0

Her formu ayrı ayrı işleyebilirim, ancak iki, üç yerine bir formla çalışmak daha kolay görünüyor ... Sunumda bazı noktalar var (gerçekten çok kısa ve daha iyi diyemem). –

cevap

4

Bir (eğer çalışırsa işaretli değil) fikir: Form nasıl inşa edildiğini

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

Sen see here. Kendi Formunuzu BaseForm'dan genişleterek ve başka bir __metaclass__ sağlayarak yapabilirsiniz. DeclarativeFieldsMetaclassFromMultipleClasses ise

class CombinedForm(BaseForm): 
    __metaclass__ = DeclarativeFieldsMetaclassFromMultipleClasses 

Eğer

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

üzerinde sınıflardan ilan alanları özetlemek dışında bireysel çünkü şablonda yerleştirilir kaç formları önemli değil, temelde here olarak aynı şeyi formlar form etiketi oluşturmaz. Yani, şablon bu

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

benzeri ve view.py gider

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