জ্যাঙ্গো ফর্ম: বৈধ না হলে ত্রুটি বার্তার সাথে ফর্মটি দেখান


112

আমি জ্যাঙ্গো ফর্ম করে, এটি ফর্মটি বৈধ কিনা তা পরীক্ষা করতে পারে:

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
আমি দেখি. আমি যে ফর্মটি পেয়েছিলাম সেভাবেই আমি ফিরে আসি The ত্রুটি বার্তাটি স্বয়ংক্রিয়ভাবে এতে_অডিয়াল () ফাংশন দ্বারা যুক্ত হয়ে গেছে।
— ব্যবহারকারী984003

হ্যাঁ আপনি এখনই পেয়েছেন আপনি যদি ম্যানুয়ালি ফর্মটি রেন্ডার না করেন তবে ত্রুটিগুলি প্রতিটি ক্ষেত্রের জন্য স্বয়ংক্রিয়ভাবে প্রদর্শিত হবে।
— আমির আদনান

@ আলেকজান্ডারসুপারট্র্যাম myFormহ'ল জ্যাঙ্গো ফর্মগুলি সম্পর্কে পড়া forms.Formবা এর একটি উদাহরণforms.ModelForm
— আমির আদনান

আমার যদি ভিউ না থাকে তবে .. উদাহরণস্বরূপ সিএমএসের মধ্যে স্ট্যান্ডার্ড অ্যাডমিন ফর্ম ব্যবহার করা। একটি 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} put রাখুন

page.html

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

আর তারপরে কী ফিরব? এটি কীভাবে আমার টেমপ্লেটে যায়?
— ব্যবহারকারী984003

আমি আমার কোড আপডেট করি। আপনি চাইলে স্ক্রিপ্টের পরিবর্তে আপনার টেম্পলেটে লুপ বার্তার জন্যও রাখতে পারেন।
— ক্যাথরিন

1
এটি একটি দুর্দান্ত পদ্ধতির - তবে সতর্ক হওয়া দরকার ('{{বার্তা}}');
— amchugh89

আপনি যেমনটি করেছেন তেমনি 'ত্রুটি'র চেয়ে ত্রুটি বার্তায় কীভাবে আরও বর্ণনামূলক কিছু রেখে দেবেন messages.error(request, "Error")?
— cbuch1800


3

আপডেট: ফর্মसेट ত্রুটির আরও বিশদ বিবরণ যুক্ত করা হয়েছে।


ফর্ম.আররেসগুলি সমস্ত ক্ষেত্র এবং ননফিল্ড_অরফারগুলি একত্র করে। অতএব আপনি এইচটিএমএল সহজ করতে পারেন:

টেমপ্লেট

    {% 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)

একটি সতর্কতামূলক: ফর্মগুলির বিপরীতে ফর্মসেট.অরফার্সগুলিতে নন_ফিল্ড_ইরিজগুলি অন্তর্ভুক্ত নয়।


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_scecessed ।

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 %}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.