Django 1.11 has introduced Class-Based Views for Authentication. In this post, we’ll look over how to use these class based views in our project.
Let’s start with the implementation of “Register User” functionality first. There is no pre-defined class based view for this. So, I’ll use CreateView for achieving this task. Through out this post, I’ll assume that we are using accounts app.
Register User Functionaility
Forms.py for user registration (accounts/forms.py)
Forms.py ( accounts app )
from django.contrib.auth.forms import UserCreationForm from django.contrib.auth.models import User
class RegisterUserForm(UserCreationForm): class Meta: model = User fields = ( ‘username’, ‘first_name’, ‘last_name’, ‘email’, ‘password1’, ‘password2’, )
Views.py for user registration (accounts/views.py)
Views.py ( accounts app )
from django.views.generic import CreateView from .forms import RegisterUserForm
class RegisterUserView(CreateView): form_class = RegisterUserForm template_name = ‘accounts/register.html’ success_url = ’/’
Template for user registration (accounts/templates/accounts/register.html)
{% extends “base.html” %}
{% block content %}
{% endblock %}
URL pattern for user registeration
from .views import RegisterUserView url(r’^register/$’, RegisterUserView.as_view(), name=‘register’)
Login, Logout, Password Change & Password Reset
Functionality of user login, logout, password change and password reset is straight-forward. URL patterns file for accounts app will do most of the work.
from django.conf.urls import url from .views import RegisterUserView
from django.urls import reverse_lazy from django.contrib.auth.views import( LoginView, LogoutView, PasswordResetView, PasswordResetDoneView, PasswordChangeView, PasswordChangeDoneView, PasswordResetConfirmView, PasswordResetCompleteView )
urlpatterns = [ url(r’^register/$’, RegisterUserView.as_view(), name=‘register’), url(r’^login/$’, LoginView.as_view(template_name=‘accounts/login.html’), name=‘login’), url(r’^logout/$’, LogoutView.as_view(next_page=reverse_lazy(‘login’)), name=‘logout’), url(r’^password-change/$’, PasswordChangeView.as_view(template_name=‘accounts/password-change.html’), name=‘password-change’), url(r’^password-change-done/$’, PasswordChangeDoneView.as_view(template_name=‘accounts/password-change-done.html’), name=‘password_change_done’), url(r’^password-reset/$’, PasswordResetView.as_view(template_name=‘accounts/password-reset.html’), name=‘password-reset’), url(r’^password-reset-done/$’, PasswordResetDoneView.as_view(template_name=‘accounts/password-reset-done.html’), name=‘password_reset_done’), url(r’^password-reset-confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$’, PasswordResetConfirmView.as_view(template_name=‘accounts/password-reset-confirm.html’), name=‘password_reset_confirm’), url(r’^password-reset-complete/$’, PasswordResetCompleteView.as_view(template_name=‘accounts/password-reset-complete.html’), name=‘password_reset_complete’), ]
Template for user login (accounts/templates/accounts/login.html)
{% extends “base.html” %}
{% block content %}
{% endblock %}
Template for password change (accounts/templates/accounts/password-change.html)
{% extends “base.html” %}
{% block content %}
{% endblock %}
Template for password change (accounts/templates/accounts/password-change-done.html)
{% extends “base.html” %}
{% block content %}
Password changed successfully!
{% endblock %}
Template for password reset (accounts/templates/accounts/password-reset.html)
{% extends “base.html” %}
{% block content %}
{% endblock %}
Template for password reset (accounts/templates/accounts/password-reset-done.html)
{% extends “base.html” %}
{% block content %}
An email has been sent with the instructions
{% endblock %}
Template for password reset (accounts/templates/accounts/password-reset-confirm.html)
{% extends “base.html” %}
{% block content %}
{% endblock %}
Template for password reset (accounts/templates/accounts/password-reset-complete.html)
{% extends “base.html” %}
{% block content %}
Password Reset Done
{% endblock %}