2010-01-31 8 views
16

मेरे पास एक मॉडल के लिए एक इनलाइन फॉर्मेट है, जिसमें एक अद्वितीय_एक साथ बाधा है। और हां, तो जब मैं इनपुट डेटा, जो इस बाधा को पूरा नहीं करता है, यह प्रदर्शित करता है:Django: फ़ॉर्मेट त्रुटियों को सही ढंग से प्रदर्शित करना

__all__Please correct the duplicate values below.

कोड है, जो यह है करता है:

{% for error in formset.errors %} 
     {{ error }}<br/> 
    {% endfor %} 

मैं ज्यादा नहीं करना त्रुटि की शुरुआत में __all__ की तरह है और यह काफी स्पष्ट रूप शब्दकोश कुंजी है, इसलिए मैं करने की कोशिश की:

{% for key, error in formset.errors %} 
     {{ key }}: {{ error }}<br/> 
    {% endfor %} 

लेकिन फिर सब मुझे मिलता है:

__all__:

{{त्रुटि}} सब पर प्रदर्शित नहीं करेगा। तो यहाँ क्या चल रहा है? और मैं सही तरीके से त्रुटि कैसे प्रदर्शित करूं?

उत्तर

24

मुझे लगता है कि समस्या यह है कि formset.errors शब्दकोशों की एक सूची है, एक एकल शब्दकोश नहीं।

Django docs page on formsets से

:

>>> formset.errors 
[{}, {'pub_date': [u'This field is required.']}] 

कर देखें कि कहीं कुछ इस तरह से समस्या का समाधान: (askers टिप्पणी के आधार पर अपडेट किया गया)

{% for dict in formset.errors %} 
    {% for error in dict.values %} 
     {{ error }} 
    {% endfor %} 
{% endfor %} 

अगर यह काम नहीं है, मैं का उपयोग कर प्रयास करता हूँ manage.py shell, और पाइथन खोल में अपनी स्थिति को पुन: पेश करने का प्रयास करें ... इस तरह विभिन्न मूल्यों का निरीक्षण करना और यह पता लगाना आसान होगा कि आपको क्या करना है।

+0

धन्यवाद :) सहायक। आपका रास्ता काम नहीं करता है, लेकिन अंत में मुझे इसे एक छोटे से संशोधन (त्रुटियों के बजाय त्रुटियों। त्रुटियों) के साथ काम करना पड़ा है, इसलिए अब यह इस तरह दिखता है: {formet.errors% में dict के लिए%} {% dict.values% में त्रुटि} {{error}} {% endfor%} {% endfor%} –

+0

खुशी है कि मैं मदद कर सकता हूं। मैंने आपकी टिप्पणियों के आधार पर अपना उत्तर अपडेट कर लिया है। ऐसा लगता है कि यह महत्वपूर्ण मुद्दा है कि यह पहले से गड़बड़ कर रहा था कि 'formet.errors' डिक्ट्स की एक सूची है, न कि एक ही निर्देश। –

+0

django के वर्तमान संस्करण के लिए, टेम्पलेट्स में त्रुटियों पर लूपिंग आम तौर पर आप जो चाहते हैं वह नहीं है। चूंकि ओपी ने अंत में पूछा "... मैं सही तरीके से त्रुटि कैसे प्रदर्शित करूं?", मैं अन्य उत्तरों का उल्लेख करता हूं जिनमें त्रुटियों पर लूपिंग शामिल नहीं है। – dsalaj

5

छोरों अनावश्यक हैं के लिए, इन त्रुटियों को सही ढंग से निम्नलिखित के साथ प्रदर्शित किया जाना चाहिए:

{{ formset.non_form_errors }} 
2

Django 1.6 formsets, एक नई पद्धति है BaseFormSet.total_error_count। टेम्पलेट सशर्त में इसका उपयोग करना सुनिश्चित करता है कि फ़ॉर्मेट में कम से कम एक त्रुटि मौजूद होने पर आप आउटपुट त्रुटियों और मार्कअप को केवल आउटपुट करेंगे।

{% if formset.total_error_count %} 
    <ul class="errorList"> 
    {% for dict in formset.errors %} 
     {% for error in dict.values %} 
     <li>{{ error }}</li> 
     {% endfor %} 
    {% endfor %} 
    </ul> 
{% endif %} 

v1.6 + के लिए Django docs page देखें।

0

यहाँ त्रुटियों की ऐसी ही समस्याएं आ किसी के लिए एक स्पष्टीकरण टेम्पलेट में गाया नहीं किया जा रहा है:

{{ formset.non_form_errors }} 

इस मूल रूप से त्रुटियों रिटर्न:

आपके पास और तो एक पूरी, उपयोग के रूप में formset के बारे में त्रुटि formset.errors से प्रविष्टि में।यह दस्तावेज है के रूप में:

""" 
    Returns an ErrorList of errors that aren't associated with a particular 
    form -- i.e., from formset.clean(). Returns an empty ErrorList if there 
    are none. 
    """ 

लेकिन यदि आप formset से रूपों प्रदान कर रहे हैं और कुछ त्रुटियों renderd किया जा रहा नहीं कर रहे हैं, तो आप शायद याद कर रहे हैं:

{% for form in formset.forms %} 
    {# ... #} 
    {{ form.non_field_errors }} 
{% endfor %} 

इस form.errors से __all__ प्रविष्टि में त्रुटियों देता है। वे non_form_errors के अनुरूप हैं, त्रुटियां जो किसी विशेष क्षेत्र से संबद्ध नहीं हैं, बल्कि फील्ड संबंधों के साथ हैं। उदाहरण के लिए आप क्षेत्रों From और To के साथ एक रूप था, और अगर From मूल्य कम है तो To मूल्य, टैग {{ form.non_field_errors }} निम्न त्रुटि प्रस्तुत करना सकता है आप को मान्य करता है, तो:

'The From value must be smaller than the To value' 
+0

यदि आप formet.non_form_errors को अपने आप मानते हैं, तो निम्न वाक्यविन्यास 'formet._non_form_errors = "मेरा त्रुटि संदेश" का उपयोग करें ('non_form_errors से पहले अंडरस्कोर पर ध्यान दें) – Ben

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