Нужно решение для аутентификации пользователя Django, связанного с некоторыми конкретными моделями, и способ создания пользователя

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

Это для использования с учениками начальных классов.

#1
Я хочу создать пользователя, но пользователь должен ввести свое имя, фамилию и пароль... и все!
Код должен быть slugify имя и фамилию разделить символом "." (это будет имя пользователя) и добавить "@mail.com" (это будет почта). Конечно, уже существует, он добавит "-1" после.

Для этого пункта на самом деле мне удалось только перегрузить модели User в Django и вместо имени пользователя ввести email.... Но это набирается вручную (имя пользователя и email) ...

#2
В ту же форму Регистра я хочу добавить возможность выбора класса, к которому он принадлежит. Этот список будет представлять собой модель с именем Role с единственным именем в ... Итак, в html форме регистрации мне нужно иметь имя (текст) / фамилия (текст) / класс (список) / пароль (пароль) ... все обязательные :)

Для последнего пункта я попытался создать модель RoleUser с User в OneToOneField и Role в ForeignKey (потому что только один класс может быть настроен на пользователя) ... Мне удается показать конкретную форму ... но когда я сохраняю ее, она добавляет пользователя с пустыми данными и добавляет новую роль с пустыми данными тоже ... Я хочу добавить только нового пользователя и новую роль пользователя, а не новую роль :p

Вот часть моего кода

users/forms.py

class UserForm(ModelForm):

    lastname = forms.CharField(label="Nom de famille", max_length=150)
    firstname = forms.CharField(label="Prénom", max_length=150)
    password = forms.CharField(widget=forms.PasswordInput(), label="Mot de passe")
    confirm_password = forms.CharField(widget=forms.PasswordInput(), label="Confirmation du mot de passe")

    class Meta:
        model = User
        fields = ('lastname', 'firstname', 'password')

    def clean(self):
        cleaned_data = super(UserForm, self).clean()
        password = cleaned_data.get("password")
        confirm_password = cleaned_data.get("confirm_password")

        if password != confirm_password:
            raise forms.ValidationError(
                "Le mot de passe ne correspond pas !"
            )

    def clean_email(self):
        '''
        Verify email is available.
        '''

        lastname = self.cleaned_data.get('lastname')
        fistname = self.cleaned_data.get('fistname')
        email = slugify(fistname+"."+lastname+"@endtg.com")
        qs = User.objects.filter(email=email)
        if qs.exists():
            raise forms.ValidationError("email is taken")
        return email

    def save(self, commit=True):
        # Save the provided password in hashed format
        user = super(UserForm, self).save(commit=False)
        user.email = self.clean_email
        user.set_password(self.cleaned_data["password"])
        if commit:
            user.save()
        return user

class ProfileInfoForm(ModelForm):
    exlude_list = ('ADMIN', 'AUTRES', 'ENSEIGNANT', 'ANCIENS')
    role = forms.ModelChoiceField(queryset=ProfileList.objects.all().exclude(nom__in=exlude_list), label="Quelle est ta classe ?", help_text="Selectionne ta classe pour accéder aux jeux adaptés à ton niveau.")

users/views.py

def register(request):

    registered = False
    if request.method == 'POST':
        user_form = UserForm(data=request.POST)
        profile_form = ProfileInfoForm(data=request.POST)

        if user_form.is_valid() and profile_form.is_valid() and user_form.cleaned_data['password'] == user_form.cleaned_data['confirm_password']:

            user = user_form.save()
            user.set_password(user.password)
            user.save()
            # This is where I'm stuck
            profile = profile_form.save(commit=False)
            profile.save()
            registered = True
            message = "Compte créé avec succès"
            messages.success(request, message)

        else:
            print(user_form.errors, profile_form.errors)
    else:
        user_form = UserForm()
        profile_form = ProfileInfoForm()
    return render(request, 'users/register.html',
                          {'user_form': user_form,
                           'profile_form': profile_form,
                           'registered': registered})
Вернуться на верх