Django forms catch ValidationError
exception and adds error to form _errors
dict. This code from django BaseForm._clean_fields
method:
try:
# ...
if hasattr(self, 'clean_%s' % name):
value = getattr(self, 'clean_%s' % name)()
self.cleaned_data[name] = value
except ValidationError as e:
self._errors[name] = self.error_class(e.messages)
if name in self.cleaned_data:
del self.cleaned_data[name]
So, by raising ValidationError
exception you are telling django to add errors to cleaning field and make your form not valid.
You can access field error in template:
{{ form.field_name.errors }}
and iterate one field errors (django docs Customizing the form template):
{% if form.subject.errors %}
<ol>
{% for error in form.subject.errors %}
<li><strong>{{ error|escape }}</strong></li>
{% endfor %}
</ol>
{% endif %}
and all fields errors (django docs Looping over the form’s fields):
{% for field in form %}
{{ field.errors }}
{{ field.label_tag }} {{ field }}
{% endfor %}
and display non field errors:
{{ form.non_field_errors }}
update: you should add else
block in view. Without else
you are always create new form:
def register_user(request):
if request.method=='POST':
form=MyRegistrationForm(request.POST)
if form.is_valid():
form.save()
messages.success(request, "Thank you for signing up")
return HttpResponseRedirect("/accounts/register_success")
else:
form = MyRegistrationForm()
args={}
args['form'] = form
return render(request,"register.html",args)