Django Forms: если не является допустимым, показать форму с сообщением об ошибке


Я Django формы, он может проверить, является ли форма действительной:

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

но мне не хватает, что делать, если он не действителен? Как вернуть форму с сообщениями об ошибках? Я не вижу "еще" ни в одном из примеров.

3 67

3 ответа:

Если вы отображаете одно и то же представление, когда форма недействительна, то в шаблоне вы можете получить доступ к ошибкам формы с помощью 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_to_response('my_template.html', {'form': form})

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}} как то, что я сделал ниже

страница.HTML-код

<html>
    <head>
        <script>
            {% if messages %}
                {% for message in messages %}
                    alert(message);
                {% endfor %}
            {% endif %}
        </script>
    </head>
    <body>
        {{form.as_p}}
    </body>
</html> 
def some_view(request):
    if request.method == 'POST':
        form = SomeForm(request.POST)
        if form.is_valid():
            return HttpResponseRedirect('/thanks'/)
    else:
        form = SomeForm()
    return render(request, 'some_form.html', {'form': form})