2009-11-27 20 views
37

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

यह सही करने के लिए, मुझे बस विजेट प्रकार जानने की आवश्यकता है। इसका वर्ग नाम या कुछ समान है। मानक पायथन में, यह आसान है! field.field.widget.__class__.__name__

दुर्भाग्यवश, आपको टेम्पलेट्स में अंडरस्कोर चर तक पहुंच की अनुमति नहीं है। बढ़िया!

आप कर सकते हैं परीक्षण field.field.widget.input_type लेकिन पाठ/पासवर्ड <input ../> प्रकार के लिए यह केवल काम करता है। मुझे और अधिक संकल्प की जरूरत है कि।

मेरे लिए, हालांकि यह मुश्किल हो सकता है, यह टेम्पलेट स्तर पर ऐसा करने के लिए सबसे अधिक समझ में आता है। मैंने कोड का थोड़ा सा आउटसोर्स किया है जो फ़ील्ड के लिए HTML को फ़ील्ड-लूप में शामिल एक अलग टेम्पलेट में संभालता है। इसका मतलब है कि यह ModelForm एस और मानक Form एस (कुछ ऐसा सच नहीं होगा यदि मैंने मध्यस्थ फॉर्म वर्ग लिखा हो)।

यदि आप एक सार्वभौमिक दृष्टिकोण देख सकते हैं जिसके लिए मुझे 20-विषम रूपों को संपादित करने की आवश्यकता नहीं है, तो मुझे भी बताएं!

+0

प्रासंगिक बग रिपोर्ट या सुविधा अनुरोध: https://code.djangoproject.com/ticket/13009 – Flimm

उत्तर

4

Django 1.11 के रूप में, तुम सिर्फ widget.input_type उपयोग कर सकते हैं। उदाहरण:

{% for field in form.visible_fields %} 
    <input type="{{ field.field.widget.input_type }}" 
      id="{{ field.id_for_label }}" 
      name="{{ field.html_name }}" 
      placeholder="{{ field.label }}" 
      maxlength="{{ field.field.max_length }}" /> 
{% endfor %} 
40

एक टेम्पलेट टैग बनाना काम कर सकता है? field.field.widget|widget_type

ओली से संपादित करें: अच्छा बिंदु! मैं सिर्फ एक फिल्टर लिखा है:

from django import template 
register = template.Library() 

@register.filter('klass') 
def klass(ob): 
    return ob.__class__.__name__ 

और अब {{ object|klass }} सही ढंग से बना देता है। अब मुझे यह पता लगाना है कि टेम्पलेट के if कथन के अंदर इसका उपयोग कैसे किया जाए।

ओली # 2 से संपादित करें: मुझे इसके परिणाम का उपयोग टेम्पलेट में स्टेटमेंट में करने की आवश्यकता है, इसलिए मैंने बस उस तर्क को templatetag में स्थानांतरित कर दिया। जादू। मुझे सही दिशा में पोक करने के लिए धन्यवाद।

+0

SO btw में आपका स्वागत है। – Oli

+1

इस समाधान के लिए धन्यवाद। संपादन # 2 के संबंध में - Django 1.2 में उन्नत 'अगर टैग' के साथ, आप टेम्पलेट में इन विजेट प्रकार तुलनाओं को सही कर सकते हैं। मैंने एक अलग जवाब के रूप में एक उदाहरण पोस्ट किया। – zlovelady

+1

जोड़ने के लिए एक और अच्छा फ़िल्टर (यदि गैर-पायथन लोग आपके टेम्पलेट्स को संभालेंगे) आपके कुछ उपयोग किए जाने वाले मामलों के लिए कुछ ऐसा है: 'def is_checkboxes (form_field_obj): वापसी (form_field_obj .__ वर्ग __.__ name__ ==" चेकबॉक्स चयन करें एकाधिक ") '... तो आप' {% अगर फ़ील्ड | is_checkboxes%} कर सकते हैं' और लोग फ्रेक नहीं करेंगे (... कोई रिटर्न नहीं) – hangtwenty

33

स्वीकार्य उत्तर के बाद - Django 1.2 में बढ़ाए गए if tag आपको if tag तुलना में फ़िल्टर का उपयोग करने की अनुमति देता है। ओली और rinti से जवाब के बाद

<ul> 
{% for field in form.fields %} 
    <li> 
    {% if field.field.widget|klass == "Textarea" %} 
    <!-- do something special for Textarea --> 
    <h2>Text Areas are Special </h2> 
    {% else %}  
     {{ field.errors }} 
     {{ field.label_tag }} 
     {{ field }} 
    {% endif %} 

    </li> 
{% endfor %} 
</ul> 
+3

+1 * field.field.widget * का उद्देश्य क्या है, जैसा कि * field.widget * का उपयोग करने के विरोध में है? – Oli

+0

के लिए – Wipqozn

+0

@Wipqozn मेरे अनुभव 'field.widget' में अक्सर कुछ भी नहीं पैदा करता है - मुझे इसके बारे में निश्चित नहीं है, लेकिन शायद यह केवल तभी सेट किया गया है जब आप इसे मैन्युअल रूप से सेट करते हैं। 'field.field.widget' काम करता है। – hangtwenty

16

:: तो आप अब अपने कस्टम HTML/तर्क टेम्पलेट में तो जैसे कर सकता है मैं इस एक का उपयोग किया और मुझे लगता है कि यह थोड़ा आसान है:

टेम्पलेट कोड : {{ field|fieldtype }}

फिल्टर कोड:

from django import template 
register = template.Library() 

@register.filter('fieldtype') 
def fieldtype(field): 
    return field.field.widget.__class__.__name__ 
संबंधित मुद्दे