2012-04-28 26 views
6

कहें कि मेरे पास 20 फ़ील्ड के साथ एक फॉर्म है, और मैं एक विशेष div वातावरण में 10 क्षेत्रों (समूह 1) और अन्य 10 फ़ील्ड (समूह 2) को एक अलग div वातावरण में रखना चाहता हूं। कुछ ऐसा:Django फॉर्म फ़ील्ड ग्रुपिंग

<div class="class1"> 
{% for field in form.group1 %} 
      {{ field.label}}: {{ field }} 
{% endfor %} 
</div> 

<div class="class2"> 
{% for field in form.group2 %} 
      {{ field.label}}: {{ field }} 
{% endfor %} 
</div> 

कोई विचार है कि मैं इसे खेतों में पुन: स्थापित करके कैसे पूरा कर सकता हूं? अधिक आम तौर पर, मैं इसे कई अलग-अलग div वातावरण और फॉर्म फ़ील्ड के सेट के साथ करने में सक्षम होना चाहता हूं।

उत्तर

13

फ़ील्ड समूह के लिए कोई तार्किक तरीका काम करेगा ... कहें कि आपके पास अपने फॉर्म पर एक तरीका है जो फ़ॉर्म फ़ील्ड लौटाता है जिसे आप स्पष्ट रूप से समूहबद्ध करते हैं?

टाइपिंग को सहेजने के लिए, शायद एक निश्चित फ़ील्ड उपसर्ग नामकरण योजना?

class MyForm(forms.Form): 
    group1_field = forms.CharField() 
    group1_field = forms.CharField() 
    group2_field = forms.CharField() 
    group2_field = forms.CharField() 

    def group1(self): 
     return [self[name] for name in filter(lambda x: x.startswith('group1_'), self.fields.values()] 

शायद उस फ़ील्ड पर एक विशेषता सेट करें जिसे आप फ़िल्टर कर सकते हैं?

class MyForm(forms.Form): 
    field = forms.CharField() 
    field.group = 1 

    field2 = forms.CharField() 
    field2.group = 2 

    def group1(self): 
     return filter(lambda x: x.group == 1, self.fields.values()) 

    def group2(self): 
     return filter(lambda x: x.group == 2, self.fields.values()) 

यदि आप इन विशेषताओं को सेट करते हैं तो आप समूह समूह का भी उपयोग कर सकते हैं।

{% regroup form.fields by group as field_group %} 
{% for group in field_group %} 
<div class="group_{{ group.grouper }}"> 
    {% for field in group.list %} 
    {{ field }} 
    {% endfor %} 
</div> 
{% endfor %} 
+0

मुझे पुन: समूह टैग का उपयोग पसंद है --- मुझे यह पता नहीं था कि यह अस्तित्व में है। धन्यवाद! –

+0

नोट: आपका पहला समाधान टेम्पलेट में फ़ील्ड पर लूप करने के लिए काफी काम नहीं करता --- अपेक्षित फ़ील्ड प्राप्त करने के लिए जनरेटर बनाने के लिए 'उपज' कीवर्ड का उपयोग करें (नीचे मेरी पोस्ट देखें) और डीजेंगो के विशिष्ट क्षेत्र पुनरावृत्ति को अनुकरण करें –

+0

@ सीआरआईडी, आप सही हैं मैं बाउंडफिल्ड्स लौटने के लिए भूल गया। अपडेट किया गया। ध्यान देने के लिए धन्यवाद! –

4

यहां एक प्रासंगिक SO प्रश्न है: Django and Fieldsets on Modelform, हालांकि यह जो कुछ मैं पूरा करना चाहता हूं उसके लिए थोड़ा अधिक लगता है। इसके अलावा, यहां एक संभावित हैक है, हालांकि मुझे यह जानकर उत्सुकता है कि Django विशेषज्ञ इस समस्या को कैसे हल करते हैं।

(0) एक अजगर fieldset उद्देश्य यह है कि iterable है तो हम एक Django टेम्पलेट में इस पर पुनरावृति कर सकते हैं परिभाषित करें:

from django.forms.forms import BoundField 

class FieldSet(object): 
    def __init__(self,form,fields,legend='',cls=None): 
     self.form = form 
     self.legend = legend 
     self.fields = fields 
     self.cls = cls 

    def __iter__(self): 
     for name in self.fields: 
      field = self.form.fields[name] 
      yield BoundField(self.form, field, name) 

(1) दृश्य उपयोग में:

fieldsets = (FieldSet(form_object, ('field_name1','field_name2'), 
         legend='Div env 1', 
         cls="class1"), 
      FieldSet(form_object, ('field_name3','field_name4'), 
         legend="Div env 2", 
         cls="class2")) 

return render_to_response('my_form.html', 
          {'form': form_object,'fieldsets':fieldsets}, 
          context_instance=RequestContext(request)) 

(2) टेम्पलेट में अब कार्य करें:

{% for set in fieldsets %} 
    <fieldset{% if set.cls %} class="{{ set.cls }}"{% endif %}> 
     <legend>{{ set.legend }}</legend> 
     {% for field in set %} 
      {{ field.label}} : {{ field }} 
     {% endfor %} 
    </fieldset> 
{% endfor %} 

ध्यान दें कि यह संभव है fieldset टैग वाई बदलने के लिए मेरे विशिष्ट प्रश्न को संबोधित करने के लिए div टैग।

+++ इस उत्तर का अधिकांश उत्तर this blog post by Michael Kowalchik से निकाला गया। +++

+0

'उपज self.form [name] 'पर्याप्त है। (मुझे बाउंडफिल्ड आयात करने में समस्याएं थीं लेकिन उस लाइन के साथ यह भी जरूरी नहीं है।) – Risadinha

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