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


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.