Django authentication using class based views

February 14, 2018 2 min read Auth Class Based Views Django

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 %}

{% csrf_token %} {{ form.as_p }}

{% 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 %}

{% csrf_token %} {{ form.as_p }}

{% endblock %}

Template for password change (accounts/templates/accounts/password-change.html)

{% extends “base.html” %} {% block content %}

{% csrf_token %} {{ form.as_p }}

{% 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 %}

{% csrf_token %} {{ form.as_p }}

{% 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 %}

{% csrf_token %} {{ form.as_p }}

{% endblock %}

Template for password reset (accounts/templates/accounts/password-reset-complete.html)

{% extends “base.html” %} {% block content %}

Password Reset Done

{% endblock %}

Comments