2013-06-18 10 views
9

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

class MyForm(forms.Form): 
    question = [] 
    questions = Question.objects.all() 
    for q in questions: 
     question.append(forms.CharField(max_length=100, label=q.questionText)) 

लेकिन यह मेरे सवालों सूची बेनकाब करने के लिए जब मैं MyForm का एक नया उदाहरण बनाने के प्रतीत नहीं होता:

मैं इस कोशिश की। क्या django रूपों का उपयोग कर फॉर्म फ़ील्ड की एक चर संख्या प्राप्त करने का कोई तरीका है, या यह क्या कर सकता है इसके दायरे से बाहर है?

+0

क्या आपने फॉर्म वर्गों के साथ फैक्ट्री पैटर्न का उपयोग करने के बारे में सोचा है? आप किसी भी रूप में किसी भी रूप में प्रपत्र को संसाधित कर सकते हैं, जो एक सूची में हो सकता है। – Brandon

उत्तर

10

यदि आप अपने फॉर्म समान हैं (उनके लेबल सहित) formsets का उपयोग करने में सक्षम हो सकते हैं। जैसे

प्रश्न: __________________
प्रश्न: __________________
प्रश्न: __________________

आदि मैं प्रत्येक प्रपत्र संभालने कर रहा हूँ केवल एक ही क्षेत्र यहाँ ('प्रश्न' फ़ील्ड) शामिल हैं। इस उदाहरण में तीन रूप हैं।


आप एक एकल रूप में क्षेत्रों में से एक गतिशील संख्या की आवश्यकता है, तो आप __init__ प्राप्त करने के लिए क्या आप चाहते हैं का उपयोग कर सकते है (ध्यान दें: अपरीक्षित कोड):

class MyForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     questions = kwargs.pop('questions') 
     super(MyForm, self).__init__(*args, **kwargs) 
     counter = 1 
     for q in questions: 
      self.fields['question-' + str(counter)] = forms.CharField(label=question) 
      counter += 1 

और तुम ' d की तरह कुछ के साथ प्रपत्र बनाने के लिए:

form = MyForm(questions=your_list_of_questions) 

आप इस लेख उपयोगी मानते हैं: http://jacobian.org/writing/dynamic-form-generation/

+0

अच्छा लेख, मुझे लगता है कि 'self.fields [' '] =' तर्क वह है जो मैं वास्तव में याद कर रहा था (कम से कम सबसे आसान तरीका जहां से मैं हूं जहां मैं बनना चाहता हूं)। जवाब के लिए धन्यवाद! –

6

बेशक आप कर सकते हैं!

class MyForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 
     for i, q in enumerate(Question.objects.all()): 
      self.fields['%s_field' % i] = forms.CharField(max_length=100, label=q.questionText) 

नोट: सुनिश्चित करें कि आपके प्रश्नों कॉल के बीच का आदेश दिया जाता है .. के रूप में क्षेत्र सूची फ़ॉर्म प्रविष्टि, रसीद, आदि

पर repopulated हो जाएगा डेटा का आदेश दिया गया है, तो और स्थिर, ऐसा नहीं होगा एक समस्या हो

इसके अलावा आप FormSet एस में भी देखना चाहते हैं, जो फॉर्मों की एक सूची है जो आपके मामले में अधिक उपयुक्त हो सकती है।

+0

@ केविन डीआईट्रैग्लिया: यदि मैं आप थे – marianobianchi

संबंधित मुद्दे