Django प्रपत्र: यदि मान्य नहीं है, तो त्रुटि संदेश के साथ फ़ॉर्म दिखाएं


112

मैं Django रूपों, यह जाँच कर सकते हैं कि क्या फार्म वैध है:

if form.is_valid(): 
    return HttpResponseRedirect('/thanks/')

लेकिन मुझे याद आ रहा है कि अगर यह मान्य नहीं है तो मुझे क्या करना चाहिए? मैं त्रुटि संदेशों के साथ फ़ॉर्म कैसे लौटाऊं? मैं किसी भी उदाहरण में "और" नहीं देख रहा हूं।

जवाबों:


242

यदि आप उसी दृश्य को प्रस्तुत करते हैं जब फॉर्म मान्य नहीं होता है, तो टेम्पलेट में आप उपयोग करते हुए फॉर्म की त्रुटियों तक पहुंचform.errors सकते हैं

{% if form.errors %}
    {% for field in form %}
        {% for error in field.errors %}
            <div class="alert alert-danger">
                <strong>{{ error|escape }}</strong>
            </div>
        {% endfor %}
    {% endfor %}
    {% for error in form.non_field_errors %}
        <div class="alert alert-danger">
            <strong>{{ error|escape }}</strong>
        </div>
    {% endfor %}
{% endif %}

एक उदाहरण:

def myView(request):
    form = myForm(request.POST or None, request.FILES or None)
    if request.method == 'POST':
        if form.is_valid():
            return HttpResponseRedirect('/thanks/')
    return render(request, 'my_template.html', {'form': form})

मैंने एक साधारण उदाहरण जोड़ा है। सुनिश्चित करें कि आप उसी दृष्टिकोण का अनुसरण कर रहे हैं जिसका मैंने उल्लेख किया है।
आमिर अदनान

1
समझा। मैं उसी फॉर्म को वापस करता हूं जो मुझे मिला था। त्रुटि संदेशों को स्वचालित रूप से is_valid () फ़ंक्शन द्वारा जोड़ा गया है।
user984003

हाँ अभी मिल गया है। यदि आपने मैन्युअल रूप से रेंडर नहीं किया है, तो त्रुटियों को प्रत्येक फ़ील्ड के लिए स्वचालित रूप से दिखाया जाएगा।
आमिर अदनान

@AlexanderSupertramp या myFormतो का एक उदाहरण है forms.Formया forms.ModelForm, Django फ़ॉर्म के
आमिर अदनान

अगर मेरे पास कोई दृश्य नहीं है .. जैसे कि CMS के भीतर एक मानक व्यवस्थापक फ़ॉर्म का उपयोग करना। एक UNIQUE constraint failed:अपवाद पर उदाहरण के लिए ?
जियोसाइडिक

19

views.py

from django.contrib import messages 

def view_name(request):
    if request.method == 'POST':
        form = form_class(request.POST)
        if form.is_valid():
            return HttpResponseRedirect('/thanks'/)
        else:
            messages.error(request, "Error")
return render(request, 'page.html', {'form':form_class()})

यदि आप फॉर्म की त्रुटियों को दिखाना चाहते हैं, तो इसके अलावा वैध नहीं है {{form.as_p}} जैसे मैंने नीचे क्या किया

page.html

<html>
    <head>
        <script>
            {% if messages %}
                {% for message in messages %}
                    alert(message);
                {% endfor %}
            {% endif %}
        </script>
    </head>
    <body>
        {{form.as_p}}
    </body>
</html> 

और फिर मैं क्या लौटाऊं? यह मेरे टेम्प्लेट में कैसे आता है?
user984003

मैं अपना कोड अपडेट करता हूं। आप चाहें तो स्क्रिप्ट के बजाय अपने टेम्प्लेट में लूप मैसेज भी डाल सकते हैं।
कैथरीन

1
यह एक अच्छा तरीका है - लेकिन सतर्क रहने की जरूरत है ('{{संदेश}}'));
अमचूगाव

आपने 'त्रुटि' की तुलना में त्रुटि संदेश में कुछ और वर्णनात्मक कैसे लगाया होगा जैसा आपने किया है messages.error(request, "Error")?
cbuch1800


3

अद्यतन: फॉर्मेट त्रुटियों का अधिक विस्तृत विवरण जोड़ा गया।


Form.errors सभी फ़ील्ड और non_field_errors को जोड़ती है। इसलिए आप इसे सरल बना सकते हैं:

टेम्पलेट

    {% load form_tags %}

    {% if form.errors %}
    <div class="alert alert-danger alert-dismissible col-12 mx-1" role="alert">
        <div id="form_errors">
            {% for key, value in form.errors.items %}
                <span class="fieldWrapper">
                    {{ key }}:{{ value }}
                </span>
            {% endfor %}
        </div>
        <button type="button" class="close" data-dismiss="alert" aria-label="Close">
            <span aria-hidden="true">&times;</span>
        </button>
    </div>
    {% endif %}


If you want to generalise it you can create a list_errors.html which you include in every form template. It handles form and formset errors:

    {% if form.errors %}
    <div class="alert alert-danger alert-dismissible col-12 mx-1" role="alert">
        <div id="form_errors">

            {% for key, value in form.errors.items %}
                <span class="fieldWrapper">
                    {{ key }}:{{ value }}
                </span>
            {% endfor %}
        </div>
        <button type="button" class="close" data-dismiss="alert" aria-label="Close">
            <span aria-hidden="true">&times;</span>
        </button>
    </div>
    {% elif formset.total_error_count %}
    <div class="alert alert-danger alert-dismissible col-12 mx-1" role="alert">
        <div id="form_errors">
            {% if formset.non_form_errors %}
                {{ formset.non_form_errors }}
            {% endif %}
            {% for form in formset.forms %}
                {% if form.errors %}
                    Form number {{ forloop.counter }}:
                    <ul class="errorlist">
                    {% for key, error in form.errors.items %}
                        <li>{{form.fields|get_label:key}}
                            <ul class="errorlist">
                                <li>{{error}}</li>
                            </ul>
                        </li>
                    {% endfor %}
                    </ul>
                {% endif %}
            {% endfor %}

        </div>
    </div>

    {% endif %}

form_tags.py

from django import template

register = template.Library()


def get_label(a_dict, key):
    return getattr(a_dict.get(key), 'label', 'No label')


register.filter("get_label", get_label)

एक कैविएट: फॉर्मसेट के विपरीत। फार्मर्स में non_field_errors शामिल नहीं हैं।


0

बस आप ऐसा कर सकते हैं क्योंकि जब आपने फॉर्म में डेटा और डेटा को अमान्य डेटा के रूप में प्रारंभ किया था:

def some_func(request):
    form = MyForm(request.POST)
    if form.is_valid():
         //other stuff
    return render(request,template_name,{'form':form})

अगर टेम्पलेट में कोई त्रुटि होगी तो कोई भी हो लेकिन फॉर्म डेटा अभी भी निम्नानुसार रहेगा:

error_demo_here


-1

आप बस एक ध्वज चर डाल सकते हैं, इस मामले में is_successed है

def preorder_view(request, pk, template_name='preorders/preorder_form.html'):
    is_successed=0
    formset = PreorderHasProductsForm(request.POST)
    client= get_object_or_404(Client, pk=pk)
    if request.method=='POST':
        #populate the form with data from the request
       # formset = PreorderHasProductsForm(request.POST)
        if formset.is_valid():
            is_successed=1
            preorder_date=formset.cleaned_data['preorder_date']
            product=formset.cleaned_data['preorder_has_products']
            return render(request, template_name, {'preorder_date':preorder_date,'product':product,'is_successed':is_successed,'formset':formset})



    return render(request, template_name, {'object':client,'formset':formset})

बाद में अपने टेम्पलेट में आप बस नीचे दिए गए कोड को डाल सकते हैं

{%if is_successed == 1 %}
<h1>{{preorder_date}}</h1>
<h2> {{product}}</h2>
{%endif %}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.