[Django]-Best way to do register a user in Django

32👍

Make two model forms, one for the User model and one for the UserProfile model.

class UserForm(django.forms.ModelForm):
    class Meta:
        model = User  

class UserProfileForm(django.forms.ModelForm):
    class Meta:
        model = UserProfile
        exclude = ['user']

Give them prefixes and display them together in the same HTML form element. In the view, check that both are valid before you save the User and then the UserProfile.

def register(request):
    if request.method == 'POST':
        uf = UserForm(request.POST, prefix='user')
        upf = UserProfileForm(request.POST, prefix='userprofile')
        if uf.is_valid() * upf.is_valid():
            user = uf.save()
            userprofile = upf.save(commit=False)
            userprofile.user = user
            userprofile.save()
            return django.http.HttpResponseRedirect(…something…)
    else:
        uf = UserForm(prefix='user')
        upf = UserProfileForm(prefix='userprofile')
    return django.shortcuts.render_to_response('register.html', 
                                               dict(userform=uf,
                                                    userprofileform=upf),
                                               context_instance=django.template.RequestContext(request))

In register.html:

<form method="POST" action="">
    {% csrf_token %}
    {{userform}}
    {{userprofileform}}
    <input type="submit">
</form>

30👍

I was just looking into this, and found out that Django has a very simple built-in new user creation form, which you can use if you want simple registration — there’s no option to, eg, save an email address and validate it, so it won’t work for the OP’s use case, but am posting it here in case other come across this question as I did, and are looking for something simple.

If you just want people to be able to choose a username and password, then the built-ins will do everything for you, including validation and saving the new user:

from django.views.generic.edit import CreateView
from django.contrib.auth.forms import UserCreationForm

urlpatterns = patterns('',
    url('^register/', CreateView.as_view(
            template_name='register.html',
            form_class=UserCreationForm,
            success_url='/'
    )),
    url('^accounts/', include('django.contrib.auth.urls')),

    # rest of your URLs as normal
)

So the only thing you have to do yourself is create register.html

More info here: http://www.obeythetestinggoat.com/using-the-built-in-views-and-forms-for-new-user-registration-in-django.html

👤hwjp

Leave a comment