Я новичок в Django и хотел бы создать «модульную форму регистрации».
Цель этой формы - выбрать нужную форму (относится к типу пользователя) для завершения регистрации нового пользователя.
models.py
class UserTypes(models.Model):
USER_TYPES = (
('simple', 'simple'),
('advanced', 'advanced')
)
user_type = models.CharField(max_length = 10, choices = USER_TYPES)
class FirstClass(models.Model):
username = models.CharField(max_length=100, null=True)
first_name = models.CharField(max_length=100, null=True)
last_name = models.CharField(max_length=100, null=True)
class SecondClass(models.Model):
link_to_first_class = models.OneToOneField(FirstClass, on_delete=models.CASCADE, null=True)
other_informations = models.CharField(max_length=200, null=True)
forms.py
class UserTypesForm(forms.ModelForm):
class Meta:
model = UserTypes
fields = '__all__'
class FirstClassForm(forms.ModelForm):
class Meta:
model = FirstClass
fields = '__all__'
class SecondClassForm(forms.ModelForm):
class Meta:
model = SecondClass
fields = '__all__'
exclude = ('link_to_first_class',)
views.py
@transaction.atomic
def modular_register(request):
if request.method == 'POST':
user_types = UserTypesForm(request.POST)
first_form = FirstClassForm(request.POST)
second_form = SecondClassForm(request.POST)
if user_types_form.is_valid() and first_form.is_valid() and second_form.is_valid():
first_form.save()
first_class_instance = FirstClass.objects.filter(username = first_form.data['username'])[0]
second_class = SecondClass(link_to_first_class = first_class_instance,
other_informations = second_form.data['other_informations'])
second_class.save()
messages.success(request, 'Account created successfully')
return redirect('modularregister')
else:
user_types_form = UserTypesForm()
first_form = FirstClassForm()
second_form = SecondClassForm()
return render(request, 'blog/modularregister.html', {'user_types_form':user_types_form, 'first_form': first_form, 'second_form' : second_form} )
template
<form method="post" >
{% csrf_token %}
<table>
{{ user_types_form.as_table }}
{{ first_form.as_table }}
{{ second_form.as_table }}
<tr>
<td><input type="submit" name="submit" value="Register" /></td>
</tr>
</table>
</form>
Объяснение:
Если пользователь выбирает "simple" в качестве user_type, должна появиться только FirstClassForm.
Если пользователь выбирает "advanced" в двух формах (FirstClassFormи SecondClassForm) должны появиться.
Поэтому я прочитал несколько статей о функции "OnChange" , которая требует написания скрипта.
Итак, вот мой вопрос:
По вашему мнению, как лучше всего выбрать только нужные формы и как с этим справиться в представлении?