2010-08-31 17 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

क्यों वे जोड़ा जा की जरूरत है? –

+0

मैं प्रत्येक फॉर्म को अलग से संसाधित कर सकता हूं, लेकिन दो, तीन के बजाय एक फॉर्म के साथ काम करना आसान लगता है ... प्रस्तुति पर कुछ बिंदु हैं (यह वास्तव में छोटा है और मैं बेहतर नहीं कह सकता)। –

उत्तर

4

एक विचार (यदि यह काम करता है तो चेक नहीं किया गया):

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

आप see here फ़ॉर्म कैसे बनाया गया है। आप बेसफॉर्म से विस्तार करके और __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... 
संबंधित मुद्दे