2010-03-24 13 views
6

डीजेगो की फॉर्म लाइब्रेरी में फॉर्म सेट की एक विशेषता है जो आपको गतिशील रूप से जोड़े गए फॉर्मों को संसाधित करने की अनुमति देती है। उदाहरण के लिए आप फ़ॉर्म सेट का उपयोग करेंगे यदि आपके एप्लिकेशन में बुकमार्क की एक सूची है, तो आप फॉर्म सेट का उपयोग कई फॉर्मों को संसाधित करने के लिए कर सकते हैं जो प्रत्येक बुकमार्क का प्रतिनिधित्व करते हैं।Django रूपों में गतिशील क्षेत्रों को संग्रहीत करना

क्या आप गतिशील रूप से किसी फ़ॉर्म में फ़ील्ड जोड़ना चाहते हैं? एक उदाहरण एक सर्वेक्षण निर्माण पृष्ठ होगा जहां आप गतिशील रूप से असीमित प्रश्न जोड़ सकते हैं। आप Django में इसे कैसे संभालेंगे?

उत्तर

7

देखो। यह आपको चरण-दर-चरण प्रक्रिया दिखाने के लिए एक उदाहरण का उपयोग करता है। महान पढ़ें।

डीजेगो के रिलीज मैनेजर a 2008 article by James Bennett भी है।

5

जोड़ने के लिए, हटाने और एक प्रपत्र या ModelForm पर फ़ील्ड बदलना सिर्फ __init__() इस तरह ओवरराइड:

class MyForm(forms.Form): 
def __init__(self, *args, **kwargs): 
    user = kwargs.pop('user') 
    other_stuff = kwargs.pop('stuff') 

    super(MyForm, self).__init__(*args, **kwargs) 

    self.fields['my_dynamic_field'] = forms.Field(...) 

    # Add fields based on user or other_stuff 

और इस तरह इसका इस्तेमाल: form = MyForm(user = user, stuff = stuff)

+0

नोट: मैं उपयोगकर्ता को kwarg सुपर __init__ पर नहीं भेज सकता; "__init __() को उठाएं एक अप्रत्याशित कीवर्ड तर्क 'उपयोगकर्ता'" – ecdani

+0

हल हो गया: kwargs.pop सुपर कॉल से पहले आना चाहिए – ecdani

5

अजगर में आप गतिशील रूप से एक वर्ग का दृष्टांत कर सकते हैं। न्यूटिन एक फॉर्म आधारित गतिशील रूप से अनुकूलित करने और कुछ फ़ील्ड जोड़ने का एक अच्छा उदाहरण दिखाता है।

तुम भी गतिशील रूप से पूरे प्रपत्र बना सकते हैं, example given by James Bennett से लिया के रूप में: "Dynamic form generation": याकूब कापलान-मॉस, Django के मूल संस्थापकों में से एक इस हाल के पोस्ट पर

def make_contact_form(user): 
    fields = { 'name': forms.CharField(max_length=50), 
      'email': forms.EmailField(), 
      'message': forms.CharField(widget=forms.Textarea) } 
    if not user.is_authenticated(): 
    fields['captcha'] = CaptchaField() 
    return type('ContactForm', (forms.BaseForm,), { 'base_fields': fields }) 
संबंधित मुद्दे