1 - Create a new django project with an app named accounts
To start we proceed by:
- creating of a new project named mysite 
- migration and creation of a super user account
- creating of a new app called accounts
 
Next, let's register our accounts application at the settings.py file:
INSTALLED_APPS = [
    'accounts.apps.AccountsConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
Our site will therefore have the following structure:
Next, let's configure the template:
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates']
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
Next, let's create the template files by creating:
1- the template home page file  "template/index.html" 
2- the'registration' directory within the template directory 
3- the files: 
           - 3.a template/registration/login.html        
    - 3.b template/registration/logout.html 
           - 3.c template/registration/signup.html 
As shown in the following figure:
2 - Creation of a system login & logout
2.1 - Using the auth app
When creating a new project, django automatically creates an application named
, as you can see from the
file:
INSTALLED_APPS = [
     'django.contrib.admin',
     'django.contrib.auth',
     'django.contrib.contenttypes',
     'django.contrib.sessions',
     'django.contrib.messages',
     'django.contrib.staticfiles',
     'accounts.apps.AccountsConfig',
]To use the
app we must to add it to our project level file
:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
     path('admin/', admin.site.urls),
     path('accounts/', include('django.contrib.auth.urls')),
]The
app that installs automatically with a new django project has multiple
and urls for managing
,
, and
management. The URLs provided by auth are:
accounts/login/ [name='login']
accounts/logout/ [name='logout']
accounts/password_change/ [name='password_change']
accounts/password_change/done/ [name='password_change_done']
accounts/password_reset/ [name='password_reset']
accounts/password_reset/done/ [name='password_reset_done']
accounts/reset/<uidb64>/<token>/ [name='password_reset_confirm']
accounts/reset/done/ [name='password_reset_complete']2.2 - Login and logout page
Now we create the "template/registration/login.html" file which will be used by the
module to
a user:
<!-- templates/registration/login.html -->
# we test if the user is authenticated
{% if user.is_authenticated %}
    You are connected as <strong> {{ user.username }}!</strong>
    <a href="/accounts/logout" >Logout !</a>
# if user is not authenticated, we display the authentication form:    
{% else %}
<h3>Log In</h3>
<form method="post">
  {% csrf_token %}
  {{ form.as_p }}
  <button type="submit">Log In</button>
</form>
{% endif %}Now if we type in the browser, the url address: http://127.0.0.1:8000/accounts/login/ we obtain the user athenication form:
And if we type the url address http://127.0.0.1:8000/accounts/logout/ we obtain this message indicating that the user is logged out:
2.3 - Settings up home page
We can now configure the home page so that it displays a welcome message to the user when he is connected and otherwise a message indicating that he is not connected followed by a link to the login page. Let's start with the configuration of the template file:
<!-- templates/index.html -->
<h2>Home Page !</h2>
{% if user.is_authenticated %}
  Hi {{ user.username }}!
  <p><a href="{% url 'logout' %}">Log Out</a></p>
{% else %}
  <p>You are not logged in</p>
  <a href="{% url 'login' %}">Log In</a>
{% endif %}In order to display the home page we will create a link to it using the TemplateView class:
# mysite/urls.py
from django.contrib import admin
from django.urls import path, include
from django.views.generic.base import TemplateView
urlpatterns = [
    path('admin/', admin.site.urls),
    path('accounts/' , include('django.contrib.auth.urls')),
    path('', TemplateView.as_view(template_name='index.html'), name='home'),
]And finally redirects to the home page after login or logout:
LOGOUT_REDIRECT_URL = '/'
LOGIN_REDIRECT_URL = '/'Now if we type the url address : http://127.0.0.1:8000/ we obtain:
And after connection:
3 - User registration form
3.1 - Creation of the registration form via the UserCreationForm class
Let's now create the
file which will generate the user
and insert within it the following code:
# accounts/forms.py
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
class UserRegisterForm(UserCreationForm):
    email = forms.EmailField()
    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']3.2 - Creation the view of accounts applications
We then create the view of application which has a method for the user registration form
# accounts/views.py
from django.shortcuts import render, redirect
from .forms import UserRegisterForm
# Users registration page
def signup(request):
    # on teste s'il y a des requetes envoyee par la methode POST
    if request.method == 'POST':
      form = UserRegisterForm(request.POST)
      if form.is_valid():
        form.save()
        username = form.cleaned_data.get('username')
        return redirect('/')
    else:
      form = UserRegisterForm()
    return render(request, 'registration/signup.html', {'form': form})Then update the url system
# mysite/urls
from django.contrib import admin
from django.urls import path, include
from django.views.generic.base import TemplateView
from accounts  import views
urlpatterns = [
    path('admin/', admin.site.urls),
    path('accounts/' , include('django.contrib.auth.urls')),
    path('', TemplateView.as_view(template_name='index.html'), name='home'),
    path('signup/' , views.signup , name ='signup'),
]And finally we build the template file:
<!-- templates/registration/signup.html -->
<h2>Registration form</h2>
<form method="POST">
  {% csrf_token %}
  <fieldset class="form-group">
    {{ form.as_p }}
  </fieldset>
  <div class="form-group">
    <button class="btn btn-outline-info" type="submit">Register</button>
  </div>
</form>Now if we type in the browser the url address: http://127.0.0.1:8000/signup/ we obtain the registration form:
my-courses.net