django

2011-01-05 6 views
8

में किसी टेम्पलेट में फ़ील्ड की गतिशील संख्या का संदर्भ देना यह सब बहुत आसान है। मेरे पास यह फॉर्म है:django

class add_basketForm(forms.Form): 
def __init__(self, selected_subunits, *args, **kwargs): 


    self.selected_subunits = selected_subunits 
    super(add_basketForm, self).__init__(*args, **kwargs) 

    for subunit in self.selected_subunits: 
     self.fields['su%d' % (subunit['unit__id'])] = forms.IntegerField() 

उपनिवेशों की संख्या अज्ञात है। मैं इस तरह कुछ उपयोग करना चाहता हूं (आपको विचार मिलता है):

{% for unit in selected_subunits %} 
    {{ form.su%s }} % (unit.unit__id) 
{% endfor %} 

लेकिन निश्चित रूप से यह काम नहीं करता है। मेरा सवाल यह है कि मैं Django टेम्पलेट भाषा में उन फॉर्मफील्ड का संदर्भ कैसे दूं?

उत्तर

4

उन फ़ील्ड को एक अतिरिक्त सूची में समूहित करें और फिर बस इस सूची में फिर से शुरू करें।

__init__ में:

self.subunit_list = [] 
for subunit in self.selected_subunits: 
     field = forms.IntegerField() 
     self.fields['su%d' % (subunit['unit__id'])] = field 
     self.subunit_list.append(field) 

टेम्पलेट में:

{% for field in form.subunit_list %} 
    ... 
{% endfor %} 
+0

+1: सबसे अच्छा समाधान टेम्पलेट में इसे नहीं रखना है, क्योंकि यह टेम्पलेट तर्क नहीं है। – KillianDS

+0

इनपुट फ़ील्ड दिखाने के लिए लूप के अंदर मैं क्या लिखूं? ऐसा लगता है कि मुझे अभी भी लूप में प्रत्येक "अज्ञात" फ़ील्डनाम का संदर्भ देने की समस्या है, उदा। यह {{field.su% s}}% (unit.unit__id) – Brian

+2

और यदि मैं सिर्फ {{field}} लिखता हूं तो मुझे इसे आउटपुट के रूप में मिलता है: Brian

7

आपके गतिशील क्षेत्र उदाहरणों, जो कि तुम क्या all of the attributes and methods necessary to render the field तक पहुंचाता है के लिए BoundField उदाहरणों का उपयोग करने के लिए, आप का उपयोग करने की आवश्यकता है form.fields[fieldname]

के बजाय क्षेत्र form.fieldname के रूप में फ़ील्ड ऑब्जेक्ट्स का उपयोग कर रहा है अपने प्रपत्र वर्ग के otential रिफैक्टरिंग:

{% for su_field in form.su_fields %} 
.... 
{% endfor %} 

(मैं के साथ संघर्ष कर रहा था:

class add_basketForm(forms.Form): 
    def __init__(self, selected_subunits, *args, **kwargs): 
     super(add_basketForm, self).__init__(*args, **kwargs) 
     for subunit in self.selected_subunits: 
      self.fields['su%d' % (subunit['unit__id'])] = forms.IntegerField() 

    def su_fields(self): 
     for name in self.fields: 
      if name.startswith('su'): 
       yield(self[name]) 
फिर अपने टेम्पलेट में

, आप क्षेत्रों पर पुनरावृति करने के लिए के रूप में आप सामान्य रूप से form.su_fields तक पहुँचकर उम्मीद करेंगे में सक्षम होना चाहिए कई घंटों के लिए यह वही समस्या है। । मुझे सही दिशा में इशारा करते हुए के लिए this answer from Carl Meyer और this article on dynamic form generation from Jacob Kaplan-Moss के लिए धन्यवाद)

1

gruszczy के जवाब सही करने के लिए इस कोड को मेरे लिए काम किया:

अपने फार्म की __init__ में:

self.subunit_list = [] 
for subunit in self.selected_subunits: 
     field = forms.IntegerField() 
     self.fields['su%d' % (subunit['unit__id'])] = field 
     self.subunit_list.append(self['su%d' % (subunit['unit__id'])]) 

अपने टेम्पलेट में:

{% for field in form.subunit_list %} 
    <!-- show form field (inputbox) --> 
    {{ field }} 
{% endfor %}