Нужно решение для аутентификации пользователя 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})