创建单独的用户类型

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.

我要的是这个:

我该如何处理这种情况?

我使用基于 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',)