Регистрация нового пользователя Django

lepiloff

Dec. 8, 2017, 4:31 p.m.

Все файлы настроек будут храниться в ранее созданном стандартным для django способом проекте registrations.

Базовая регистрация

Самый  простой способ добавить нового пользователя - использовать UserCreationForm. Это подходит если вы используете дефолтные настройки Django User, содержащий поля user и password.

urls.py

from django.conf.urls import url
from registrations.views import signup

urlpatterns = [
    ...
    url(r'^signup/$', signup, name='signup'),
]

views.py

from django.contrib.auth import login, authenticate
from .forms import SignUpForm
from django.shortcuts import render, redirect

def signup(request):
    if request.method == 'POST':
        form = SignUpForm(request.POST)
        if form.is_valid():#Если форма заполнена правильно
            form.save()#Создаем пользователя
            username = form.cleaned_data.get('username')#с именем
            raw_password = form.cleaned_data.get('password1')# и паролем
            user = authenticate(username=username, password=raw_password)
            login(request, user)
            return redirect('index')#страница редиректа после регистрации
    else:
        form = SignUpForm()
    return render(request, 'signup.html', {'form': form})
    

В основном то, что мы здесь делаем, это обработка UserCreationForm. После того, как код достигнет form.save(), пользователь будет создан. Но здесь нам нужно сделать еще один шаг: вручную аутентифицировать пользователя. 

Чтобы выполнить аутентификацию, нам нужно захватить необработанный пароль из ввода, который пришел из POST. User.password хранит хэш, и мы не можем использовать его напрямую для аутентификации.

Если функция authenticate() успешно выполнена (в этом случае она всегда будет успешной), это будет экземпляр пользователя (что означает совпадение имени пользователя и пароля), теперь мы можем безопасно зарегистрировать пользователя. Это делается путем вызова login(), передавая запрос и экземпляр пользователя в качестве параметра. После этого просто перенаправьте пользователя туда, куда хотите.

signup.html

{% extends 'base.html' %}

{% block content %}
  <h2>Регистрация</h2>
  <form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Зарегистрироваться</button>
  </form>
{% endblock %}

На этом простая форма регистрации на django готова

Регистрация с дополнительными полями

Что, если нам надо добавить email пользователя и его полное имя к стандартным полям формы регистрации django. Эта стратегия будет работать, если вы используете Django user как есть без изменений, или если вы расширили его с помощью AbstractUser или AbstractBaseUser.

Далее нам необходимо расширить родную джанговскую форму UserCreationForm

forms.py

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User

class SignUpForm(UserCreationForm):
    first_name = forms.CharField(max_length=30, required=False, help_text='Optional.')
    last_name = forms.CharField(max_length=30, required=False, help_text='Optional.')
    email = forms.EmailField(max_length=254, help_text='Required. Inform a valid email address.')

    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2', )  

Теперь в представлении нам просто надо изменить класс формы на SignUpForm

views.py

from django.contrib.auth import login, authenticate
from django.shortcuts import render, redirect
from .forms import SignUpForm

def signup(request):
    if request.method == 'POST':
        form = SignUpForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            raw_password = form.cleaned_data.get('password1')
            user = authenticate(username=username, password=raw_password)
            login(request, user)
            return redirect('home')
    else:
        form = SignUpForm()
    return render(request, 'signup.html', {'form': form})

 

django