2009-08-10 8 views
19

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

उत्तर

29

Django 1.2 के रूप में, यदि आपके फॉर्म में required_css_class नामक एक विशेषता है, तो इसे आवश्यक फ़ील्ड के लिए BoundField.css_classes में जोड़ा जाएगा। फिर आप वांछित रूप में फॉर्म के आवश्यक हिस्सों को स्टाइल करने के लिए सीएसएस का उपयोग कर सकते हैं। एक ठेठ उपयोग के मामले:

# views.py 
class MyForm(django.forms.Form): 
    required_css_class = 'required' 
    … 

...

/* CSS */ 
th.required { font-weight: bold; } 

...

<!-- HTML --> 
<tr> 
    <th class="{{form.name.css_classes}}">{{form.name.label_tag}}</th> 
    <td>{{form.name.errors}}{{form.name}}</td> 
</tr> 

आप का उपयोग करते हैं Form.as_table(), Form.as_ul, और Form.as_p, वे स्वतः ऐसा करते हैं, <tr> के वर्ग जोड़ने, <li> , और <p> क्रमशः।

+8

नोट करें कि आप इस विधि का उपयोग करके तारांकन जोड़ने के लिए सीएसएस सामग्री निर्देश का उपयोग कर सकते हैं: 'th.required: {content: '*'} के बाद' –

1

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

+0

मेरी रूपों में से कोई भी प्रदान की गई है {{}} प्रपत्र, मैं स्पष्ट रूप से क्षेत्रों, कहते हैं। मुझे किसी फ़ील्ड या विजेट की विशेषता की तरह कुछ कम चाहिए। – gruszczy

+0

यदि आप मॉडलफॉर्म के बारे में बात कर रहे हैं और मेटा क्लास की 'फील्ड' प्रॉपर्टी का उपयोग करके फ़ील्ड का सबसेट निर्धारित करने के लिए काम करेंगे, तो यह काम करेगा। यदि आपके पास गैर-मॉडल रूप हैं और छिपे हुए फ़ील्ड हैं, तो यह फिर से काम करेगा। मैं जल्दबाजी में हूं, क्षमा करें अगर मुझे कुछ याद आ रहा है? – shanyu

+0

मेरे पास एक एकल प्रपत्र है जिसका उपयोग कई टेम्पलेट्स में किया जाता है और मैं आमतौर पर टेम्पलेट में आवश्यक सभी फ़ील्ड को कॉल करता हूं। यही कारण है कि मैं templated प्रतिपादन का उपयोग नहीं कर सकता। लेकिन ऐसा लगता है कि यह बेहतर होगा, अगर मैंने अभी मेटा के साथ कुछ उप-वर्ग बनाए हैं और फिर इस टेम्पलेटिंग का उपयोग करें। यह अच्छा विचार है, मुझे इसके बारे में सोचना है। – gruszczy

1

मैं अपने फ़ील्ड और त्रुटियों के साथ फॉर्म फ़ील्ड्स प्रस्तुत करने के लिए एक टेम्पलेट टैग का उपयोग करता हूं, साथ ही आवश्यक फ़ील्ड के लिए एक तारांकन और सीएसएस क्लास। Www.djangosnippets.org पर इसे करने के लिए कई स्निपेट उपलब्ध हैं

+0

तो क्या मैं इस समय करता हूं, मेरा मतलब है कि मैं ऐसा करने के लिए फ़िल्टर का उपयोग करता हूं। फिर भी, यह बहुत शुष्क नहीं है। मैं इस सेटिंग को फॉर्म में रखना पसंद करूंगा (कुछ 'mark_required = True' रूप में)। – gruszczy

0

व्यक्तिगत मैंने इस तरह कुछ करने की कोशिश की, यानि डिफ़ॉल्ट टेम्पलेट टैग को ओवरराइड करना (यह आवश्यक सभी-पढ़ने वाले फ़ील्ड के लिए सभी व्यवस्थापक इंटरफेस में एक लाल तारांकन जोड़ता है। फिर मैंने अपने विचारों के लिए एक दूसरा टैग भी परिभाषित किया जो इनलाइन और ब्लॉक को मिलाता है लेबल नीचे कोड (कॉपी/कुछ संशोधनों के साथ Django स्रोत कोड के पेस्ट) देखें:।

settings.py में:

from django.forms.util import flatatt 
from django.utils.html import conditional_escape 
from django.utils.safestring import mark_safe 
import django.forms.forms as django_forms 
def custom_label_tag(self, contents=None, attrs=None): 
     """ 
     Wraps the given contents in a <label>, if the field has an ID attribute. 
     Does not HTML-escape the contents. If contents aren't given, uses the 
     field's HTML-escaped label. 

     If attrs are given, they're used as HTML attributes on the <label> tag. 
     """ 
     contents = contents or conditional_escape(self.label) 
     widget = self.field.widget 
     id_ = widget.attrs.get('id') or self.auto_id 
     if id_: 
      attrs = attrs and flatatt(attrs) or '' 
      if self.field.required: 
       label = unicode(contents) 
       label_suffix = "" 
       if label[-1] == ":": 
        label = label[:-1] 
        label_suffix += ":" 
       contents = u'<label for="%s"%s>%s<span style="color:red;">*</span>%s</label>' % (widget.id_for_label(id_), attrs, label, label_suffix) 
      else: 
       contents = u'<label for="%s"%s>%s</label>' % (widget.id_for_label(id_), attrs, unicode(contents)) 
     return mark_safe(contents) 

def custom_inline_label_tag(self, contents=None, attrs=None): 
    if attrs: 
     if "class" in attrs.keys(): 
      attrs["class"] += " inline" 
     else: 
      attrs["class"] = "inline" 
    else: 
     attrs = {"class": "inline"} 
    return self.label_tag(contents, attrs) 
django_forms.BoundField.label_tag = custom_label_tag # override django method 
django_forms.BoundField.inline_label_tag = custom_inline_label_tag 

मेरे टेम्पलेट में

<p>{{ form.fieldname.errors}}{{ form.fieldname.inline_label_tag }}{{form.fieldname}}</p> 
OR 
<p>{{ form.fieldname.errors}}{{ form.fieldname.label_tag }}{{form.fieldname}}</p> 
2

तुम भी एक field.field.required संपत्ति का उपयोग कर सकते हैं: क्योंकि मैं आमतौर पर प्रपत्र के क्षेत्रों में से केवल सबसेट प्रदर्शित

{% for field in form %} 
    {{field.label}} {% if field.field.required %} * {% endif %} 
    {{field}} 
    {{field.errors}} 
{% endfor %} 
संबंधित मुद्दे

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