如何解决django 多个用户在注册时遇到多个组问题
这是我的问题,我用 django 管理面板创建了 3 个组('admin'、'prof'、'etudiant',但我目前不使用组管理员)。我创建了两个模型类,它们从带有 oneToOneField 的 User 模型(“Professeur”和“Etudiant”)继承而来。我还为所有两个模型类创建了一个注册表单。 使用 django post_save 我可以用组注册我的不同用户。但是现在,如果我尝试使用自己的注册表单注册一个新用户“Professeur”,它会自动添加到“prof”和“etudiant”这两个组中。 怎么做才能让一个用户只属于一个组
etudiant/models.py
>from django.db import models
from django.contrib.auth.models import User
from django.core.validators import RegexValidator
class Etudiant(models.Model):
user = models.OneToOneField(User,on_delete=models.CASCADE,primary_key=True)
et_matricule_regex = RegexValidator(regex=r'^(ET)-[A-Z]{2}-(PM)-[\d]{4}$',message="ex: ET-AD-PM-2020 -> Etudiant - Ali Diop - Pierre Michel- 2020")
et_numero_matricule = models.CharField(validators=[et_matricule_regex],max_length=40,unique=True,verbose_name="numéro matricule")
et_lieu_de_residence = models.CharField(max_length=150,blank=True,verbose_name="lieu de résidence")
et_date_de_naissance = models.DateField(null=True,verbose_name="date de naissance")
et_telephone_regex = RegexValidator(regex=r'^\+?[\d]{3}-[\d]{2}-[\d]{2}-[\d]{2}-[\d]{2}$',message="+000-00-00-00-00")
et_telephone = models.CharField(validators=[et_telephone_regex],verbose_name="telephone")
professeur/models.py
>from django.db import models
from django.contrib.auth.models import User
from django.core.validators import RegexValidator
class Professeur(models.Model):
user = models.OneToOneField(User,primary_key=True)
prof_matricule_regex = RegexValidator(regex=r'^(PR)-[A-Z]{2}-(PM)-[\d]{4}$',message="ex: PR-ZT-PM-2017 -> Professeur - Zan Togola - Pierre Michel- 2017")
prof_numero_matricule = models.CharField(validators=[prof_matricule_regex],verbose_name="numéro matricule")
prof_lieu_de_residence = models.CharField(max_length=150,verbose_name="lieu de résidence")
prof_date_de_naissance = models.DateField(null=True,verbose_name="date de naissance")
prof_telephone_regex = RegexValidator(regex=r'^\+?[\d]{3}-[\d]{2}-[\d]{2}-[\d]{2}-[\d]{2}$',message="+000-00-00-00-00")
prof_telephone = models.CharField(validators=[prof_telephone_regex],max_length=30,verbose_name="telephone")
etudiant/signals.py
>from django.db.models.signals import post_save
from django.contrib.auth.models import User,Group
from django.dispatch import receiver
from .models import Etudiant
@receiver(post_save,sender=User)
def etudiant_profil(sender,instance,created,**kwargs):
if created:
group = Group.objects.get(name='etudiant')
instance.groups.add(group)
Etudiant.objects.create(
user=instance,)
professeur/signals.py
>from django.db.models.signals import post_save
from django.contrib.auth.models import User,Group
from django.dispatch import receiver
from .models import Professeur
@receiver(post_save,sender=User)
def professeur_profil(sender,**kwargs):
if created:
group = Group.objects.get(name='prof')
instance.groups.add(group)
Professeur.objects.create(
user=instance,)
etudiant/apps.py
>from django.apps import AppConfig
class EtudiantConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'etudiant'
def ready(self):
import etudiant.signals # noqa
professeur/apps.py
>from django.apps import AppConfig
class ProfesseurConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'professeur'
def ready(self):
import professeur.signals # noqa
etudiant/views.py
>from django.shortcuts import render,redirect
from compte.forms import CreateUserForm
from .forms import EtudiantForm
from compte.decorators import unauthenticated_user
from django.contrib import messages
@unauthenticated_user
def etudiantRegisterPage(request):
if request.method == 'POST':
form = CreateUserForm(request.POST)
etudiant_form = EtudiantForm(request.POST)
if form.is_valid() and etudiant_form.is_valid():
user = form.save()
etudiant = etudiant_form.save(commit=False)
etudiant.user = user
etudiant.save()
messages.success(request,'Compte etudiant créer avec succès !')
return redirect('login')
else:
form = CreateUserForm()
etudiant_form = EtudiantForm()
context = {
'form': form,'etudiant_form': etudiant_form
}
return render(request,'registerEtudiant.html',context)
professeur/views.py
>from django.shortcuts import render,redirect
from .forms import ProfesseurForm
from compte.forms import CreateUserForm
from compte.decorators import unauthenticated_user
from django.contrib import messages
@unauthenticated_user
def professeurRegisterPage(request):
if request.method == 'POST':
form = CreateUserForm(request.POST)
professeur_form = ProfesseurForm(request.POST)
if form.is_valid() and professeur_form.is_valid():
user = form.save()
professeur = professeur_form.save(commit=False)
professeur.user = user
professeur.save()
messages.success(request,'Compte professeur creer avec succès !')
return redirect('login')
else:
form = CreateUserForm()
professeur_form = ProfesseurForm()
context = {
'form': form,'professeur_form': professeur_form
}
return render(request,'registerProfesseur.html',context)
组
我的表格
#User creation form
class CreateUserForm(UserCreationForm):
password1 = forms.CharField(required=True,label="Mot de passe",widget=forms.PasswordInput(
attrs={'style': 'width: 100%;'}),)
password2 = forms.CharField(required=True,label="Confirmation du mot de passe",)
class Meta:
model = User
fields = ['first_name','last_name','username','email']
widgets = {
'first_name': forms.TextInput(attrs={
'style': 'width: 100%;'
}),'last_name': forms.TextInput(attrs={
'style': 'width: 100%;'
}),'username': forms.TextInput(attrs={
'style': 'width: 100%;'
}),'email': forms.EmailInput(attrs={
'style': 'width: 100%;'
}),}
#Professeur creation form
class ProfesseurForm(ModelForm):
class Meta:
model = Professeur
fields = '__all__'
exclude = ['user']
widgets = {
'prof_numero_matricule': forms.TextInput(attrs={
'style': 'width: 100%;'
}),'prof_lieu_de_residence': forms.TextInput(attrs={
'style': 'width: 100%;'
}),'prof_date_de_naissance': forms.DateInput(attrs={
'style': 'width: 100%;'
}),'prof_telephone': forms.TextInput(attrs={
'style': 'width: 100%;'
}),}
#Etudiant creation form
class EtudiantForm(forms.ModelForm):
class Meta:
model = Etudiant
fields = '__all__'
exclude = ['user']
widgets = {
'et_numero_matricule': forms.TextInput(attrs={
'style': 'width: 100%;'
}),'et_lieu_de_residence': forms.TextInput(attrs={
'style': 'width: 100%;'
}),'et_date_de_naissance': forms.DateInput(attrs={
'style': 'width: 100%;'
}),'et_telephone': forms.TextInput(attrs={
'style': 'width: 100%;'
}),}
解决方法
这个问题是因为信号发送者是 User
模型本身引起的。因此,保存其中一个配置文件的用户实例将同时调用 professeur_profil
和 etudiant_profil
接收器。解决此问题的一种方法是将接收者的发送者改为配置文件模型:
@receiver(post_save,sender=Professeur)
def professeur_profil(sender,instance,created,**kwargs):
if created:
group = Group.objects.get(name='prof')
instance.user.groups.add(group)
@receiver(post_save,sender=Etudiant)
def etudiant_profil(sender,**kwargs):
if created:
group = Group.objects.get(name='etudiant')
instance.user.groups.add(group)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。