Django register and login - explained by example

26,884

THIS is a very good tutorial about login & Co. It explains very well how to perform login by ourself ad override existing django login pages.

UPDATE:

Here Overview for Registration and Login. For more details go to the link.

To Register:

Views and URLs

Go to the lower site folder (where the settings.py file is) and open the views.py file. At the top make sure the following imports are included. Add them if not:

from django.shortcuts import
 render_to_response from django.http import HttpResponseRedirect from
 django.contrib.auth.forms import UserCreationForm from
 django.core.context_processors import csrf

Below that add the following functions (you can put them after the Login functions):

 def
 register(request):
     if request.method == 'POST':
         form = UserCreationForm(request.POST)
         if form.is_valid():
             form.save()
             return HttpResponseRedirect('/accounts/register/complete')

     else:
         form = UserCreationForm()
     token = {}
     token.update(csrf(request))
     token['form'] = form

     return render_to_response('registration/registration_form.html', token)

 def registration_complete(request):
     return render_to_response('registration/registration_complete.html')

Open the urls.py file in the site folder (same folder as settings.py). Below urlpatterns = patterns('', insert the following lines.

     # Registration URLs
     url(r'^accounts/register/$', 'simplesite.views.register', name='register'),
     url(r'^accounts/register/complete/$', 'simplesite.views.registration_complete',
 name='registration_complete'),

Templates We will assume your site already has a templates directory and a base.html file with the navigation bar. Open the base.html file and in the nav element add a navigation menu link to the login page

<a href="/accounts/register">register</a>

If one does not already exist, go to the templates folder and create a folder inside it named registration. Create a file called registration_form.html, save it to the templates/registration folder, then populate it with the following:

{% extends "base.html" %} {% block title %}Register{%
 endblock %} {% block content %}

   <h2>Registration</h2>

   <form action="/accounts/register/" method="post">{% csrf_token %}
     {{form.as_p}}   <input type="submit" value="Register" />

   </form>

 {% endblock %}

Create a file called registration_complete.html, save it to the templates/registration folder, and populate it with the following:

{% extends "base.html" %} {% block title %}You are
 Registered{% endblock %} {% block content %}

   <h2>Thank you for Registering</h2>   <p><a
 href="/accounts/login/">Please Login</a></p>

 {% endblock %}

To Login:

Views and URLs Open the views.py file in the lower site folder (where the settings.py file is). If there isn't one then create and save it. At the top of the file insert the following import: from django.shortcuts import render_to_response Below that you only need to add one function rendering the loggedin page. The other functions (login and logout) are in the views.py file in the Django Auth folder.

def loggedin(request):
    return render_to_response('registration/loggedin.html')

# Optionally, if you want to show their username when they login then call their username in the view. Change the loggedin function to:

def loggedin(request):
    return render_to_response('registration/loggedin.html',
                              {'username': request.user.username})

Open the urls.py file in the site folder (same folder as settings.py). Below urlpatterns = patterns('', insert the following lines.

# Auth-related URLs:
url(r'^accounts/login/$', 'django.contrib.auth.views.login', name='login'),
url(r'^accounts/logout/$', 'django.contrib.auth.views.logout', name='logout'),
url(r'^accounts/loggedin/$', 'simplesite.views.loggedin', name='loggedin'),

With simplesite being the name of the folder that holds the views.py file that you are calling. Open the settings.py file and at the bottom insert LOGIN_REDIRECT_URL = '/accounts/loggedin/'. Django's default is to redirect to /accounts/profile when you log in, which is fine if you have an profile page at that url. If not you need to change your settings default for the Login redirect url to the one holding your loggedin.html page.

Templates

We will assume your site already has a templates directory and a base.html file with the navigation bar. Open the base.html file and in the nav element add a navigation menu link to the login page <a href="/accounts/login">login</a> Add a logout link too <a href="/accounts/logout">logout</a> Create a directory called registration inside the templates folder. If you do this through the command line, type mkdir registration Create a file called login.html, save it to the templates/registration folder, and populate it with the following:

{% extends "base.html" %}
{% block title %}Log In{% endblock %}
{% block content %}

<form method="post" action="{% url 'django.contrib.auth.views.login' %}">
{% csrf_token %}
<table>
  {{ form.as_table }}
</table>

<input type="submit" value="login" />
</form>

{% endblock %}

{{ form.as_table }} uses the Django Forms module to create the form. You can create an unformatted form by using {{ form }} without the HTML table tags, or have each field put inside paragraph tags with {{ form.as_p }}, or as an unordered list {{ form.as_ul }}. Optionally, you can also lay out your own form structure and use the form field tags as follows:

{% extends "base.html" %}
{% block title %}Log In{% endblock %}
{% block content %}

<form method="post" action="{% url 'django.contrib.auth.views.login' %}">
{% csrf_token %}

{% if form.errors %}
<p>Your Username or Password were not entered correctly. Please try again.</p>
{% endif %}

<table>
<tr>
    <td>{{ form.username.label_tag }}</td>
    <td>{{ form.username }}</td>
    <td>{{ form.username.errors }}</td> 
</tr>
<tr>
    <td>{{ form.password.label_tag }}</td>
    <td>{{ form.password }}</td>
    <td>{{ form.password.errors }}</td>
</tr>
</table>

<input type="submit" value="login" />
</form>

{% endblock %}

Create a file called loggedin.html, save it to the templates/registration folder, and populate it with the following:

{% extends "base.html" %}
{% block title %}Logged In{% endblock %}
{% block content %}

  <h2>You are logged in</h2>

{% endblock %}

If you want to display the username, you would make the adjustment to the view discussed in the views section. Then change the loggedin.html template to the below (change the wording as you see fit):

{% extends "base.html" %}
{% block title %}Logged In{% endblock %}
{% block content %}

<h1>Welcome {{username}}</h1>
<p>Thank you for logging in.</p>
<p><a href="/accounts/logout/">Logout</a></p>

{% endblock %}

Create a file called logged_out.html, save it to the templates/registration folder and populate it with the following:

{% extends "base.html" %}
{% block title %}Logged Out{% endblock %}
{% block content %}

  <h2>Logged out!</h2>
  <p><a href="/accounts/login/">Log back in</a></p>

{% endblock %}
Share:
26,884
boldnik
Author by

boldnik

Updated on August 16, 2020

Comments

  • boldnik
    boldnik over 3 years

    Can someone please explain in details how to make a registration and authentication in as easy words as possible ? I made authentication (login) with django.contrib.auth but what I want to get is a full register(social/non)+login. Already saw the django-allauth, django-social-auth, django-social but still can't get it working without hacking a lot. Heard that django-registration and django-profiles can make it a lot easier, but i can't handle it. For example,

    ~/.virtualenvs/plinter/lib/python2.7/site-packages/registration/backends/default/urls.py
    

    needs a small hack to work:

    # from django.views.generic.simple import direct_to_template
    from django.views.generic import RedirectView
    ...
                               RedirectView.as_view(url='/registration/activation_complete.html'),
                               # direct_to_template,
                               # {'template': 'registration/activation_complete.html'},
    ...
    

    The DjangoBook gives simple examples of Contact and search forms. But i can't expand it on user registration and login. So can anyone give kis example of working registration and login?

    Update

    Here is a simple example of login. Now django-allauth or social auth or registration2 are in consideration...

    Update2

    django-allauth seems to be the best solution for easier authentication. Add correctly apps in settings, register fb/google/etc apps and register through admin and use template inheritance to change default pages design.

  • ljk321
    ljk321 almost 9 years
    While this link may answer the question, it is better to include the essential parts of the answer here and provide the link for reference. Link-only answers can become invalid if the linked page changes.
  • Trix
    Trix almost 9 years
    It is not a simple thing to report the code if you look at the tutorial! I try to put some essential code...
  • Trix
    Trix almost 9 years
    @skyline75489: I hope that now the answer is acceptable, so please could you remove your downvote?
  • ljk321
    ljk321 almost 9 years
    Actually I didn't downvote. I just came through this answer while doing reviewing.
  • Trix
    Trix almost 9 years
    Ok, I hope that they are correct and revise their downvote because that link is really very useful and it solved my days when I studied authentication.
  • ljk321
    ljk321 almost 9 years
    Don't get upset, man. People downvote for so many reasons. Personally I feel that it would be more appropriate that you can put this link as a comment instead of an answer.