Django регистрация

Блог Полезное

Django регистрация

Django регистрация

Меня зовут Андрей, я разработчик в веб-студии "kmv-it". Наш профиль - это разработка сайтов на Django, Modx, 1C-Bitrix. В блоге я буду стратся описывать проблемы и решения, которые могут возникнуть при разработке сайтов на Django, так как в русско-язычном интернете решений конкретных проблем очень мало, все приходится искать на зарубежных сайтах. 

Ниже я опишу как привязать регистрацию в Django стандартными средствами.

Краткое описание статьи


  • Опишу как сделать регистрацию на основе модели пользователя

  • На основе своей custom модели

  • И напишу как вывести дополнительные поля в форму регистрации

Как сделать Django регистрацию на основе модели User

Самый простой метод это использовать встроенную UserCreationForm в качестве основы для формы регистрации. Но это интересно только в том случае, если вы используете username и password в качестве регистрации. 

url.py


from django.conf.urls import url
from .core import views as s

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

views.py


from django.shortcuts import render, redirect
from django.contrib.auth.forms import UserCreationForm

def signup(request):
if request.method == 'POST':
form = UserCreationForm(request.POST)
if form.is_valid():
form.save()
return redirect('index')
else:
form = UserCreationForm()
return render(request, 'signup.html', {'form': form})

signup.html


{% extends 'base.html' %}

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

Эта форма выведет три поля Логин, пароль и подтверждение пароля. Если вы хотите сразу авторизовать пользователя после регистрации, то:

views.py


from django.shortcuts import render, redirect

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

Теперь после регистрации пользователя перекинет на страницу с именем index и залогинет, точнее в обратном порядке. Если вы хотите кастомизировать свою форму, то можно пройти циклом for в шаблоне по полям и добавить свои плюшки.

signup.html


{% extends 'base.html' %}

{% block content %}
<h2>Регистрация</h2>
<form method="post">
{% csrf_token %}
{% for field in form %}
<p>
{{ field.label_tag }}<br>
{{ field }}
{% if field.help_text %}
<span>{{ field.help_text }}</span>
{% endif %}
{% for error in field.errors %}
<p>{{ error }}</p>
{% endfor %}
</p>
{% endfor %}
<button type="submit">Отправить</button>
</form>
{% endblock %}

Django registration

Как добавить дополнительные поля в форму регистрации Django

Нужно переопределить стандартную форму UserCreationForm.

form.py


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

class SignUpForm(UserCreationForm):
email = forms.EmailField(max_length=254, help_text='Это поле обязательно')

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

views.py


from mysite.core.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')
my_password = form.cleaned_data.get('password1')
user = authenticate(username=username, password=my_password)
login(request, user)
return redirect('home')
else:
form = SignUpForm()
return render(request, 'signup.html', {'form': form})

Просто меняете UserCreationForm на SignUpForm и теперь в шаблоне будет выводится поле email. 

django регистрация

С этим разобрались, теперь рассмотрим

Как сделать форму регистрации для своей модели Profile

Предположим у нас есть модель Profile, которая через OneToOneField соединена с User.

models.py


from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver

class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
city = models.CharField(max_length=300, blank=True)
born = models.DateField(null=True, blank=True)

@receiver(post_save, sender=User)
def new_user(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
instance.profile.save()

Создали модели, добавили свои поля и связь с User, дописали метод new_user, который создает User, если создан объект Profile. Теперь добавим в нашу форму новые поля

form.py


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

class SignUpForm(UserCreationForm):
class Meta:
model = User
fields = ('username', 'born', 'city', 'password1', 'password2', )

Обновим 

views.py


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

Теперь в форме регистрации появяться два новых поля и при сохранении User будет создан и Profile.