Robin
Robin

Reputation: 5486

Templates now showing any errors in Django

I have a form for registration. When I try to register, it does and everything is fine, just that, its now showing any Form Validation Errors in the template, when there should be.

forms.py:

from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from django import forms
import re
from django.core.exceptions import ObjectDoesNotExist



class UserCreationForm(UserCreationForm):
    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'username',)

    username = forms.EmailField(label='Email', max_length=250)

    def save(self, commit=True):
        user = super(UserCreationForm, self).save(commit=False)
        user.email = user.username
        user.save()
        return user

    def clean_password2(self):
        if 'password1' in self.cleaned_data:
            password1 = self.cleaned_data['password1']
            password2 = self.cleaned_data['password2']
            if password1 == password2:
                return password2
        raise forms.ValidationError('Password do not match.')

    def clean_username(self):
        username = self.cleaned_data['username']
        if not re.search(r'^\w[\w.]*@[\w.]+$', username):
            raise forms.ValidationError('Please enter a valid email address.')
        try:
            User.objects.get(username=username)
        except ObjectDoesNotExist:
            return username
        raise forms.ValidationError('Email address is already taken.')

views.py:

 def register_user(request):
     if request.method == 'POST':
         form = UserCreationForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/accounts/register_success')
        else:
            print form.is_valid()
            print form.errors
    args = {}
    args.update(csrf(request))

    args['form'] = UserCreationForm()
    print args
    return render_to_response('register.html', args)

register.html:

{% extends "base.html" %}

{% block content %}

<h1>Registration:</h1>
<form method="post" action=".">
{% csrf_token %}
    {{form.as_p}}
    <input type="submit" value="Register" />
</form>

{% endblock %}

I even tried {% if form.errors %}:

{% extends "base.html" %}

{% block content %}

{% if form.errors %}
    <p>{{form.errors }}</p>
{% endif %}

<h1>Registration:</h1>
<form method="post" action=".">
{% csrf_token %}
    {{form.as_p}}
    <input type="submit" value="Register" />
</form>

{% endblock %}

But with no luck. I think I am missing something.

Upvotes: 0

Views: 574

Answers (1)

karthikr
karthikr

Reputation: 99620

The reason is, if there are errors, you are overwriting it with form=UserCreationForm()

Basically, if if form.is_valid() is False, you need to send the form unaltered. By calling form=UserCreationForm after form.is_valid() you are overriding the errors

Try this:

def register_user(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/accounts/register_success')
        else:
            print form.is_valid()
            print form.errors
    else:
        form = UserCreationForm()

    return render_to_response('register.html', {'form': form}, context_instance=RequestContext(request))

Upvotes: 3

Related Questions