Я создал форму, которая наследуется от UserCreationForm
, и использую представление на основе классов, которое наследует CreateView
, и когда я использую сервер выполнения и отображаю форму, внизу есть раздел Аутентификация на основе пароля, которую я не замечаю
from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreationForm
class RegisterForm(UserCreationForm):
"""Form to Create new User"""
class Meta:
model = get_user_model()
fields = ["username", "password1", "password2"]
from django.views.generic import CreateView
from .forms import RegisterForm
from django.urls import reverse_lazy
class SignUp(CreateView):
form_class = RegisterForm
template_name = "register.html"
success_url = reverse_lazy("core:Login")
def form_valid(self, form):
user = form.save()
if user:
login(self.request, user)
return super().form_valid(form)
<h1>signup</h1>
{{form}}
И когда я запустил код, я увидел этот вывод
Поэтому я не ожидал аутентификации на основе пароля.
🤔 А знаете ли вы, что...
Python поддерживает динамическую типизацию, что облегчает разработку.
Начиная с версии Django 5.1, UserCreationForm
по умолчанию имеет поле usable_password
. Это относится к функции Django для установки неиспользуемых паролей для пользователей. Это полезно, если вы используете какую-либо внешнюю аутентификацию, например единый вход или LDAP.
Поскольку ваша форма, похоже, обращена к пользователю, и показывать это поле вашему пользователю не имеет особого смысла (эта конкретная форма по умолчанию больше ориентирована на использование на сайте администратора), вам следует просто удалить поле из формы, установив это None
:
class RegisterForm(UserCreationForm):
"""Form to Create new User"""
usable_password = None
class Meta:
model = get_user_model()
fields = ["username", "password1", "password2"]