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})