Django Представление регистрации не сохраняет модель пользователя в базу данных
Я создал форму регистрации + вид + шаблон, но когда я пытаюсь зарегистрироваться, пользователь не сохраняется в базе данных, и он не входит в систему.
Я ожидал, что моя форма зарегистрирует пользователя и сохранит его в базе данных. Вот мой код
(Форма регистрации)
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
class UserRegistrationForm(forms.ModelForm):
email = forms.EmailField()
password = forms.CharField(label='Password', widget=forms.PasswordInput)
password2 = forms.CharField(label='Confirm password', widget=forms.PasswordInput)
class Meta:
model = User
fields = ['username', 'email']
def check_password(self):
if self.cleaned_data['password'] != self.cleaned_data['password2']:
raise forms.ValidationError('Passwords do not match!')
return self.cleaned_data['password2']
(Просмотр реестра)
def register_view(request):
if request.method == 'POST':
register_form = UserRegistrationForm(request.POST)
if register_form.is_valid():
user = register_form.save(commit=False)
user.set_password = register_form.cleaned_data['password']
# Automatically log in the user after registration
username = register_form.cleaned_data['username']
password = register_form.cleaned_data['password']
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
# Redirect to a success page or home page
return redirect('home1:index') # Adjust 'home' to your home page URL name
else:
register_form = UserRegistrationForm()
return render(request, 'register.html', {'register_form': register_form})
(Регистрационный шаблон)
<form class="form" method="post">
{% csrf_token %}
<label class="label" for="email">Email:</label>
<input class="input" type="text" id="email" name="email">
<label class="label" for="username">Username:</label>
<input class="input" type="text" id="username" name="username">
<label class="label" for="password">Password:</label>
<input class="input" type="password" id="password" name="password">
<label class="label" for="confirm_password">Confirm Password:</label>
<input class="input" type="password" id="confirm_password" name="password1">
<button class="button" type="submit">Register</button>
</form>
Форма не регистрирует пользователя, потому что register_form.is_valid() выдает false.
Первопричина: форма не содержит поля password2.
чтобы исправить эту ошибку, измените ваш html следующим образом:
<form class="form" method="post">
{% csrf_token %}
<label class="label" for="email">Email:</label>
<input class="input" type="text" id="email" name="email">
<label class="label" for="username">Username:</label>
<input class="input" type="text" id="username" name="username">
<label class="label" for="password">Password:</label>
<input class="input" type="password" id="password" name="password">
<label class="label" for="confirm_password">Confirm Password:</label>
<input class="input" type="password" id="confirm_password" name="password2">
<button class="button" type="submit">Register</button>
</form>
Для выявления подобных проблем всегда следует проверять register_form.errors
Вы также можете вывести ошибки на html следующим образом:
{{register_form.errors}}