创建单独的用户类型

时间:2017-09-11 11:38:34

标签: django django-1.11

我正在开发一个需要两种类型用户的Intranet Web应用程序。可以从django admin和特定类型的用户设置的普通用户 - 员工。

我有Employee类型用户的以下模型。

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表。

我想要的是:

  • 每次创建Employee时,我都需要User创建。
  • 可以使用单独的注册表单创建员工,例如emp_signup

我如何处理这种情况?

1 个答案:

答案 0 :(得分:0)

我使用基于此article启发的AbstractUser的自定义用户实现了这一目标。

class CustomUser(AbstractUser):
    pass

class Employee(CustomUser):
    user = models.OneToOneField(settings.AUTH_USER_MODEL)
    # other fields

在settings.py中,我添加以下密钥:

AUTH_USER_MODEL = 'myapp.CustomUser'

无论我需要引用User类,我都会使用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',)