Django нет доступа к определенным методам AbstractUser с использованием UserManager
Я новичок в Django Я пытаюсь получить доступ к form.save()
с помощью form = self.form_class(request.POST)
, но мне приходится использовать такие методы как self.get_form_class()
для доступа к form.is_valid()
и form.save()
, но не могу получить метод set_password()
из user = form.save(commit=False)
Я не уверен, в чем проблема. Почему я не могу получить доступ к user.set_password()
? Даже когда я пытаюсь создать BaseUserManager
self.model()
не дает мне определения для user.set_password()
или user.save()
почему так?
- Вы могли бы создать
RegistrationForm
, унаследованный отUserCreationForm
# forms.py
from django.contrib.auth.forms import UserCreationForm
class RegistrationForm(UserCreationForm):
class Meta:
model = CustomUser
fields = ("first_name", "last_name", "username", "phone_number",)
что касается метода clean
- вам не нужно проверять, отправил ли пользователь какое-то определенное поле, просто в вашей модели CustomUser вы должны добавить эти поля без null=True
, blank=True
. как пример:
class CustomUser(AbstractUser):
first_name = models.CharField(_("first name"), max_length=150)
и теперь я могу удалить проверку на имя_первого_фамилии в clean-методе вашей регистрационной формы. В результате этого рефакторинга - clean-метод должен быть удален.
Не беспокойтесь о поле confirm_password
, оно существует в UserCreationForm, но называется password2
, оригинальный пароль называется password1
. и проверка пароля в этой форме также существует
- Ответ на ваш вопрос с помощью
set_password
из предыдущего пункта мы получили форму, унаследованную отUserCreationForm
, у которой этаset_password
логика уже записана в методе сохранения. Вам просто нужно вызватьform.save()
. так что ваш пост-метод в представлении:
def post(self, request):
form = self.get_form_class()
form = form(request.POST)
if form.is_valid():
form.save()
messages.add_message(request, messages.SUCCESS, "Your account has been successfully created.")
return redirect("AskQuestions:login")
return render(request, self.template_name, {"form": form})