Handling Form Errors & Messages
When form validation fails, Django stores errors that you display in templates. The Django messages framework provides flash messages for success, info, warning, and error notifications across requests.
15 min•By Priygop Team•Updated 2026
Errors & Messages
- {{ form.errors }} — All form errors
- {{ form.field.errors }} — Errors for a specific field
- {{ form.non_field_errors }} — Form-level errors
- messages.success(request, 'Post created!')
- messages.error(request, 'Something went wrong!')
- messages.info() / messages.warning()
- {% for message in messages %} — Display flash messages
- Messages persist across redirects (stored in session)
Error & Message Handling
Error & Message Handling
# blog/views.py
# from django.contrib import messages
# def create_post(request):
# if request.method == 'POST':
# form = PostForm(request.POST)
# if form.is_valid():
# form.save()
# messages.success(request, 'Post created successfully!')
# return redirect('blog:list')
# else:
# messages.error(request, 'Please fix the errors below.')
# else:
# form = PostForm()
# return render(request, 'blog/form.html', {'form': form})
# Template — Display messages
# {% if messages %}
# {% for message in messages %}
# <div class="alert alert-{{ message.tags }}">
# {{ message }}
# </div>
# {% endfor %}
# {% endif %}
# Template — Display field errors
# <form method="post">
# {% csrf_token %}
# {% for field in form %}
# <div class="form-group {% if field.errors %}has-error{% endif %}">
# {{ field.label_tag }}
# {{ field }}
# {% for error in field.errors %}
# <span class="error-text">{{ error }}</span>
# {% endfor %}
# </div>
# {% endfor %}
# {% if form.non_field_errors %}
# {% for error in form.non_field_errors %}
# <p class="error">{{ error }}</p>
# {% endfor %}
# {% endif %}
# <button type="submit">Submit</button>
# </form>Tip
Tip
UpdateView and DeleteView need pk or slug in the URL. Use success_url or get_success_url() for redirects.
Diagram
Loading diagram…
QuerySets are LAZY — no DB hit until evaluated.
Common Mistake
Warning
Not setting success_url or get_success_url() in CreateView/UpdateView. Django raises ImproperlyConfigured after save.
Practice Task
Note
(1) Build UpdateView and DeleteView. (2) Add confirmation template for delete. (3) Set success_url.
Quick Quiz
Key Takeaways
- When form validation fails, Django stores errors that you display in templates.
- {{ form.errors }} — All form errors
- {{ form.field.errors }} — Errors for a specific field
- {{ form.non_field_errors }} — Form-level errors