Проверьте, пожалуйста, правильно ли я выполнил функцию "register" в django
Я новичок в django, не могли бы вы проверить, правильно ли я сделал функцию "register", без применения djang1o форм, потому что мне трудно это сделать, поэтому я выбрал этот способ [введите описание изображения здесь]
Пожалуйста, не пишите пользовательскую логику для создания объектов модели. Например, в представлении, которое вы здесь используете, вы не проверяете, появляются ли элементы в данных request.POST, более того, вы создаете объект Customers, даже если позже окажется, что это имя пользователя используется. Таким образом, это делает логику более сложной, а представление менее надежным.
Также мне не совсем понятно, зачем вы повторяете данные и в Customer, и в User, это вводит дублирование данных. Если позже пользователь изменит свой email, то вам придется обновлять и User и Customer, что усложняет представление. Обычно для этого используется ForeignKey для ссылки на пользователя. Модель пользователя по умолчанию даже имеет поля first_name и last_name, поэтому ваша модель Customers не добавляет столько дополнительной информации. Таким образом, вы можете смоделировать пользователя следующим образом:
from django.conf import settings
class Customer(models.Model):
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE
)
Затем мы можем подклассифицировать CreateUserForm и добавить поля first_name, last_name и email:
# app_name/forms.py
from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreationForm
class CustomCreateUserForm(UserCreationForm):
class Meta:
model = get_user_model()
fields = ('username', 'email', 'first_name', 'last_name')
Затем в представлении мы можем исправить работу с этой формой:
from app_name.forms import CustomCreateUserForm
def register(request):
if request.method == 'POST':
form = CustomUserCreateForm(request.POST)
if form.is_valid():
user = form.save()
Customer.objects.create(user=user)
return redirect('login_user')
elif 'password2' in form.errors:
messages.info(request, 'Both passwords are not matching')
elif 'username' in form.errors:
messages.info(request, 'Username is already taken')
elif 'email' in form.errors:
messages.info(request, 'Email is already taken')
return render(request, 'compte/register.html')
В HTML-форме вы используете password2 вместо repassword, а first_name и last_name вместо fname и lname. Форма также будет проверять, что адрес электронной почты является действительным адресом электронной почты, а не просто / или !.