django-registration is a pluggable Django app that implements a common registration-activation flow. This flow is quite similar to the password reset flow, but slightly simpler with only 3 views:

register registration_complete activate

The basic idea is that an anonymous user can create a new account, but cannot login until they activate their account by clicking a link they’ll receive in an activation email. It’s a way to automatically verify that the new user has a valid email address, which is generally an acceptable proxy for proving that they’re human. Here’s an Information Architecture diagram, again using jjg’s visual vocabulary.

Here’s a more in-depth walk-thru with our fictional user named Bob:

Bob encounters a section of the site that requires an account, and is redirected to the login page. But Bob does not have an account, so he goes to the registration page where he fills out a registration form. After submitting the registration form, Bob is taken to a page telling him that he needs to activate his account by clicking a link in an email that he should be receiving shortly. Bob checks his email, finds the activation email, and clicks the activation link. Bob is taken to a page that tells him his account is active, and he can now login.

As with password reset, I think the last step is unnecessary, and Bob should be automatically logged in when his account is activated. But to do that, you’ll have to write your own custom activate view. Luckily, this isn’t very hard. If you take a look at the code for registration.views.activate, the core code is actually quite simple:

from registration.models import RegistrationProfile def activate(request, activation_key): user = RegistrationProfile.objects.activate_user(activation_key.lower()) if not user: # handle invalid activation key else: # do stuff with the user, such as automatically login, then redirect

The rest of the custom activate view is up to you.