В Django, как передать пользовательскую информацию из html-формы регистрации пользователя в модели?

В моем Django-проекте есть два типа профилей (персональный и бизнес). На основе формы, которую пользователь заполняет в signup.html (которая сейчас очень примитивна), будет создан один из типов профилей.

(Моя реализация основана на этом - раздел Расширение модели пользователя с помощью связи "один-к-одному").

models.py

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    location = models.CharField(max_length=30, blank=True)
    company_name = models.TextField(max_length=100, null=True, blank=True)
    phone_number = models.TextField(max_length=20, null=True, blank=True)
    is_vendor = models.BooleanField(default=False)


@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()

views.py:

class SignupForm(UserCreationForm):
    class Meta:
        model = User
        fields = ('username', 'email', 'password1', 'password2',)

    username = forms.CharField(widget=forms.TextInput(attrs={
        'placeholder': 'Your username',
        'class': 'w-full py-4 px-6 rounded-xl'
    }))
    ...


class BusinessSignupForm(SignupForm):
    class Meta(SignupForm.Meta):
        model = User
        fields = SignupForm.Meta.fields + ('company_name',)

    company_name = forms.CharField(widget=forms.TextInput(attrs={
        'placeholder': 'Company name',
        'class': 'w-full py-4 px-6 rounded-xl'
    }))


class PersonSignupForm(SignupForm):
    class Meta:
        model = User
        fields = SignupForm.Meta.fields + ('phone_number',)

    phone_number = forms.CharField(widget=forms.TextInput(attrs={
        'placeholder': 'Phone number',
        'class': 'w-full py-4 px-6 rounded-xl'
    }))

views.py:

def signup(request):
    form_personal = PersonSignupForm()
    form_business = BusinessSignupForm()

    if request.method == 'POST':
        if 'personal_account' in request.POST:
            form = PersonSignupForm(request.POST)
        elif 'business_account' in request.POST:
            form = BusinessSignupForm(request.POST)
        else:
            return render(request, 'core/signup.html', {'error': 'Invalid form submission'})

        if form.is_valid():
            form.save()
            return redirect('/login/')  # Redirect to your home page after successful signup
        else:
            print("FORM IS NOT VALID")
            print(form.errors)
    else:
        form_personal = PersonSignupForm()
        form_business = BusinessSignupForm()

    return render(request, 'core/signup.html', {'form_personal': form_personal,
                                                'form_business': form_business})

signup.html:

{% block content %}
    <div class="tab-content">
        <div class="tab-pane container active" id="personal_account">
            <h3>Personal Account</h3>
            <form method="post" action=".">
                {% csrf_token %}
                {{ form_personal.non_field_errors }}
                {{ form_personal.as_p }}
                <input type="hidden" name="personal_account" value="true">
                <button class="py-4 px-8 text-lg bg-teal-500 hover:bg-teal-7 rounded-xl text-white">Create personal account</button>
            </form>
        </div>
    </div>
    <div class="tab-content">
        <div class="tab-pane container fade" id="business_account">
            <h3>Business Account</h3>
            <form method="post">
                {% csrf_token %}
                {{ form_business.non_field_errors }}
                {{ form_business.as_p }}
                <input type="hidden" name="business_account" value="true">
            <button class="py-4 px-8 text-lg bg-teal-500 hover:bg-teal-7 rounded-xl text-white">Create business account</button>
            </form>
        </div>
    </div>
{% endblock %}

Мои вопросы:

  1. При регистрации я вижу все ожидаемые параметры, которые должен заполнить пользователь (например, номер телефона для личного аккаунта и название компании для бизнес-аккаунта). Я не вижу этих полей в базе данных (даже после миграции). Я вижу только имя пользователя, электронную почту и пароль. Почему так происходит и как сделать так, чтобы добавленные мною параметры (номер телефона, название компании) сохранились в базе данных?

  2. Я хочу устанавливать тип учетной записи в зависимости от того, какую форму заполняет пользователь. Так, если пользователь заполняет личную форму, is_vendor будет false, а если бизнес-форму - true. Как передать эту информацию в create_user_profile и save_user_profile?

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