В 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 %}
Мои вопросы:
При регистрации я вижу все ожидаемые параметры, которые должен заполнить пользователь (например, номер телефона для личного аккаунта и название компании для бизнес-аккаунта). Я не вижу этих полей в базе данных (даже после миграции). Я вижу только имя пользователя, электронную почту и пароль. Почему так происходит и как сделать так, чтобы добавленные мною параметры (номер телефона, название компании) сохранились в базе данных?
Я хочу устанавливать тип учетной записи в зависимости от того, какую форму заполняет пользователь. Так, если пользователь заполняет личную форму,
is_vendor
будет false, а если бизнес-форму - true. Как передать эту информацию вcreate_user_profile
иsave_user_profile
?