2010-08-31 22 views
7

处理多个表单的最佳方式是什么?我想将几种形式合并为一个。例如,我想ImangeFormSet和EntryForm结合成一种形式: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 

我发现2岁的演示介绍multipleform_factory()方法,但我不知道这是最好的办法:http://www.slideshare.net/kingkilr/forms-getting-your-moneys-worth

+0

为什么他们需要结合起来呢? – 2010-08-31 20:04:08

+0

我可以分别处理每个表单,但它似乎更容易与一个表单而不是两个,三个......在演示文稿中有一些要点(它非常短,我不能说更好)。 – 2010-08-31 20:21:09

回答

4

的想法(不检查它是否有效):

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

see here表格是如何构建的。您可以通过从BaseForm扩展并提供另一个__metaclass__来制作自己的表单。

class CombinedForm(BaseForm): 
    __metaclass__ = DeclarativeFieldsMetaclassFromMultipleClasses 

在DeclarativeFieldsMetaclassFromMultipleClasses你做基本相同,here,除非你总结在

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

从类声明的字段不要紧,有多少形式被放置在模板中,因为个人表单不会呈现表单标记。所以,你的模板是这样的

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

和view.py

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