Как сделать разные формы регистрации в зависимости от типа пользователя. Тип пользователя должен быть установлен перед самой регистрацией

Я пытаюсь сделать разные регистрационные формы для разных типов пользователей. Я создал пользовательского пользователя, который может быть либо клиентом, либо продавцом, вот так:

class CustomUser(AbstractBaseUser, PermissionsMixin):
    class UserTypeChoices(models.TextChoices):
        Customer = 'Customer', _('Customer')
        Seller = 'Seller', _('Seller')
     
    type = models.CharField(
        max_length=8,
        choices=UserTypeChoices.choices,
    )

Моя идея заключается в том, что сначала человек, который заходит на мой сайт, должен выбрать свой тип, а затем он может зарегистрироваться в соответствии с этим типом. У продавцов в качестве USERNAME_FIELD должны быть номера телефонов, а у покупателей - email. Я знаю, что мне придется написать пользовательский бэкенд для этого, но все же это то, что я хочу сделать.

Я решил сделать две разные формы для этого: Первая с полем типа, которая должна перенаправлять на форму с обычной регистрацией. Эта первая форма выглядит следующим образом:

class UserTypeForm(UserCreationForm):
    class Meta:
        model = get_user_model()
        fields = ["type"]

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if self._meta.model.USERNAME_FIELD in self.fields:
            self.fields[self._meta.model.USERNAME_FIELD].widget.attrs[
                "autofocus"
            ] = True
        del self.fields["password1"]
        del self.fields["password2"]

    def save(self, commit=True):
        user = super().save(commit=False)
        return user

И вот на чем я остановился сейчас, так как это дает мне:

Traceback (most recent call last):
  File "D:\Python\Hillel\VolunteeringHub\venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
    response = get_response(request)
  File "D:\Python\Hillel\VolunteeringHub\venv\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "D:\Python\Hillel\VolunteeringHub\venv\lib\site-packages\django\views\generic\base.py", line 103, in view
    return self.dispatch(request, *args, **kwargs)
  File "D:\Python\Hillel\VolunteeringHub\venv\lib\site-packages\django\views\generic\base.py", line 142, in dispatch
    return handler(request, *args, **kwargs)
  File "D:\Python\Hillel\VolunteeringHub\venv\lib\site-packages\django\views\generic\edit.py", line 184, in post
    return super().post(request, *args, **kwargs)
  File "D:\Python\Hillel\VolunteeringHub\venv\lib\site-packages\django\views\generic\edit.py", line 153, in post
    return self.form_valid(form)
  File "D:\Python\Hillel\VolunteeringHub\src\accounts\views.py", line 21, in form_valid
    self.object = form.save(commit=False)
  File "D:\Python\Hillel\VolunteeringHub\src\accounts\forms.py", line 29, in save
    user = super().save(commit=False)
  File "D:\Python\Hillel\VolunteeringHub\venv\lib\site-packages\django\contrib\auth\forms.py", line 141, in save
    user.set_password(self.cleaned_data["password1"])
KeyError: 'password1'

Несмотря на то, что у меня здесь commit=False, это не позволяет мне сохранить пользователя без пароля.

Мой вопрос в том, как я могу сохранить эту форму, чтобы просмотр перенаправлял на ту или иную форму регистрации.

Заранее спасибо!

Вернуться на верх