创建单独的用户类型
Create a separate user type
我正在开发一个需要两类用户的 Intranet Web 应用程序。可以从 django admin 和特定类型的用户设置的普通用户 -
员工。
我有以下针对员工类型用户的模型。
class Employee(models.Model):
emp_name = models.CharField(max_length=500)
slug = models.SlugField(unique=True, default='')
location = models.CharField(max_length=200)
email = models.EmailField()
experience = models.TextField(blank=True)
primary_skill = models.ManyToManyField(PrimarySkill)
secondary_skill = models.ManyToManyField(SecondarySkill)
我尝试按照官方文档使用这样的 OneToOneField 并且
this article:
user = models.OneToOneField(User, blank=True, null=True, on_delete=models.CASCADE)
@receiver(post_save, sender=User)
def create_employee(sender, instance, created, **kwargs):
if created:
Employee.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_employee(sender, instance, **kwargs):
instance.employee.save()
我意识到这与我想要的相反。每次用户
是从管理员创建的,在
app_employee table.
我要的是这个:
- 每次创建一个
Employee
,我需要创建一个User
。
- 可以使用单独的注册表单创建员工,例如 emp_signup
我该如何处理这种情况?
我使用基于 AbstractUser
的自定义用户实现了此 article。
class CustomUser(AbstractUser):
pass
class Employee(CustomUser):
user = models.OneToOneField(settings.AUTH_USER_MODEL)
# other fields
在settings.py中,然后添加以下键:
AUTH_USER_MODEL = 'myapp.CustomUser'
在任何需要引用用户 class 的地方,我都使用 get_user_model()
,它将在视图和表单中替换我们的自定义用户,如下所示:
views.py
from django.contrib.auth import get_user_model
def user_profile(request):
User = get_user_model()
user = get_object_or_404(User, username=request.user.username)
return render(request, 'user/user_profile.html', {
'site_user': user
})
forms.py
class SignUpForm(UserCreationForm):
class Meta:
model = get_user_model()
fields = ('username', 'email', 'password1', 'password2',)
我正在开发一个需要两类用户的 Intranet Web 应用程序。可以从 django admin 和特定类型的用户设置的普通用户 - 员工。
我有以下针对员工类型用户的模型。
class Employee(models.Model):
emp_name = models.CharField(max_length=500)
slug = models.SlugField(unique=True, default='')
location = models.CharField(max_length=200)
email = models.EmailField()
experience = models.TextField(blank=True)
primary_skill = models.ManyToManyField(PrimarySkill)
secondary_skill = models.ManyToManyField(SecondarySkill)
我尝试按照官方文档使用这样的 OneToOneField 并且 this article:
user = models.OneToOneField(User, blank=True, null=True, on_delete=models.CASCADE)
@receiver(post_save, sender=User)
def create_employee(sender, instance, created, **kwargs):
if created:
Employee.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_employee(sender, instance, **kwargs):
instance.employee.save()
我意识到这与我想要的相反。每次用户 是从管理员创建的,在 app_employee table.
我要的是这个:
- 每次创建一个
Employee
,我需要创建一个User
。 - 可以使用单独的注册表单创建员工,例如 emp_signup
我该如何处理这种情况?
我使用基于 AbstractUser
的自定义用户实现了此 article。
class CustomUser(AbstractUser):
pass
class Employee(CustomUser):
user = models.OneToOneField(settings.AUTH_USER_MODEL)
# other fields
在settings.py中,然后添加以下键:
AUTH_USER_MODEL = 'myapp.CustomUser'
在任何需要引用用户 class 的地方,我都使用 get_user_model()
,它将在视图和表单中替换我们的自定义用户,如下所示:
views.py
from django.contrib.auth import get_user_model
def user_profile(request):
User = get_user_model()
user = get_object_or_404(User, username=request.user.username)
return render(request, 'user/user_profile.html', {
'site_user': user
})
forms.py
class SignUpForm(UserCreationForm):
class Meta:
model = get_user_model()
fields = ('username', 'email', 'password1', 'password2',)