2010-03-10 12 views
8

का उपयोग कर रहा कुछ इस तरह के निर्माण को स्वचालित करने के कोशिश कर रहा हूँ बनाने के लिए:Django: HTML इनपुट सरणी एक Django रूप

<input type='text' name='asdf[]' /> 
<input type='text' name='asdf[]' /> 
<input type='text' name='asdf[]' /> 

रूप में एक सीमा को दोहराते रहते हैं। मैं कई अन्य भिन्नताओं के साथ इस तरह की चीजों की कोशिश कर रहा हूं:

# in a model class 
for i in range(1, prim+1): 
    self.fields['asdf'] = forms.CharField(label=i) 

# in the template 
<form action='#' method='post'> 
    {{form.as_p}} 
</form> 

लेकिन मुझे कोई भाग्य नहीं मिला है।

मैं इनपुट की एक सरणी स्वचालित करने के बारे में कैसे जा सकता हूं?

** संपादित ** स्पष्ट करने के लिए, अंत में मैं इस तरह टेम्पलेट में खेतों उपयोग करने में सक्षम होने की जरूरत है:

{% for input in form.fields.asdf %} 
{{input}} 
{% endfor %} 

कौन सा तो उम्मीद है कि मुझे मूल इनपुट सूची ऊपर दिखाए गए मिलेगा .. ।

+0

में आपका लूप सिर्फ एक अवैध लेबल (एक पूर्णांक नहीं हो सकता है) और ओवरराइटिंग self.field ['asdf'] के साथ एक नया चारफिल्ड बना रहा है। मुझे यकीन नहीं है कि आप क्या करने की कोशिश कर रहे हैं। क्या आप विकल्प विशेषता का उपयोग करने का मतलब है? –

+0

हाँ, इसका विशेष संस्करण बस ओवरराइट करता है। सूचियों और/या शब्दकोश बनाने की कोशिश करने से पहले मेरे पास अधिक जटिल कोड था लेकिन मैं उन्हें काम करने के लिए नहीं मिला। – Brant

+0

शायद आप अपने लेबल 'asdf' या कुछ बना सकते हैं, फिर सभी फ़ील्ड के माध्यम से लूप कर सकते हैं, अगर '{% ifequal field.label 'asdf'%} 'मैचों को आउटपुट करते हैं, और फिर 1, 2 दिखाने के लिए' forloop.counter' का उपयोग करें , 3, आदि। मैंने नीचे अपना जवाब अपडेट किया। –

उत्तर

1

इसे और अधिक जैसे की तरह होना चाहिए:

# in a model class 
for i in range(1, prim+1): 
    self.fields['asdf_%s' % i] = forms.CharField(label='Label %i' % i) 

लेकिन यह बहुत आप क्या हासिल करना चाहते पर निर्भर करता है।

+0

मैं नहीं चाहता कि फ़ील्ड आउटपुट होने पर अलग-अलग नाम हों। – Brant

+1

क्या कोई विशेष कारण है कि आप अलग-अलग फ़ील्ड नाम नहीं चाहते हैं? बस उत्सुक। –

+0

@ ब्रेंट: ठीक है स्पष्ट रूप से एक शब्दकोश में एक कुंजी के लिए एक से अधिक मान नहीं हो सकते हैं।अपने कोड में आप बार-बार मैदान को ओवरराइड कर रहे हैं। –

7

याकूब कापलान-मॉस (Django के सह लेखक) ने हाल ही गतिशील रूपों, जो एक पसंदीदा तरीका में अपनी समस्या को हल करना चाहिए निपटने के लिए एक महान लेख पोस्ट: http://jacobian.org/writing/dynamic-form-generation/

वह एक ही विधि है कि फेलिक्स का सुझाव उपयोग कर रहा है, लेकिन अवधारणा पर बेहतर समझ पाने के लिए पूरे लेख को पढ़ने लायक है।

asdf[] तकनीक का उपयोग करना मैला है, क्योंकि तब आपको ऑर्डरिंग से निपटना होगा। यह मानक अभ्यास भी नहीं है।

संपादित करें:

स्थिति है जहाँ आप पता लगाने के लिए जब आप इन गतिशील क्षेत्रों हिट की जरूरत है संभाल करने के लिए: जैसे मैं प्रपत्र तोड़कर मैं क्या करने की जरूरत कर सकते हैं

{% for input in form.fields %} 
    {% ifequal input.label 'asdf' %} 
     {{ forloop.counter }}: {{input}}<br /> 
    {% endifequal %} 
{% endfor %} 
+0

इस तरह मैंने मूल रूप से चीजों को सेटअप किया था। दुर्भाग्य से, यह मेरी आवश्यकताओं को पूरा नहीं करता है। वर्णन टेक्स्ट का एक अनुच्छेद है जिसे मुझे asdf [] इनपुट शुरू होने से पहले डालने की आवश्यकता है ... और asdf [] इनपुट की संख्या गतिशील होने की आवश्यकता है। तो, मुझे यह पता लगाने में सक्षम होना चाहिए कि asdf इनपुट शुरू होने वाले हैं, एक अनुच्छेद प्रदर्शित करें, फिर उन्हें बाहर थूक दें। – Brant

+1

+1 अच्छा लेख जो आपने लिंक किया है। –

+0

लेख का सारांश: अपने फॉर्म वर्ग को भारी उठाने दें। महान पढ़ें। – Seth