Django: разрешить пользователю выбирать правильные формы для регистрации - PullRequest
0 голосов
/ 25 октября 2018

Я новичок в 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" , которая требует написания скрипта.

Итак, вот мой вопрос:

По вашему мнению, как лучше всего выбрать только нужные формы и как с этим справиться в представлении?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...