0

我有一个这样的自定义用户设置:

class CustomUser(AbstractUser):
    pass

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

然后在 settings.py 中添加以下键:

AUTH_USER_MODEL = 'myapp.CustomUser'

我想确定谁登录将他们重定向到适当的视图或 URL。

在我的帐户激活视图中,登录后我将它们重定向到相应的页面,如下所示

if hasattr(user, 'employee'):
    return redirect('edit_employee', slug=user.employee.slug)
else:
    return redirect('index')

但这感觉不对,因为我需要在其他地方使用它,比如在模板中显示不同的个人资料页面链接。

如何更好地识别视图和模板中的常规用户和员工?

4

2 回答 2

1

扩展用户模型以创建员工模型的想法对我来说似乎并不好。取而代之的是,您可以使用Django 组模型并将用户添加到员工组。通过这种方式,您可以轻松检查用户是否属于 Employee 组。

此外,您还可以在此处使用django 权限。将您的自定义权限分配给员工组并限制其他用户查看员工页面。

于 2017-10-07T07:07:53.430 回答
1

AFAIK 你不应该将不同类型的用户存储在不同的表中。在定义其他模型和您的用户模型之间的关系时,这会让您的生活变得非常困难。

我建议的方法是profile为不同类型的用户使用不同的模型,并使用通用 FK 或其他类似方法来找出用户类型并获取他们的个人资料。

class CustomUser(AbstractUser):
    USER_TYPE_EMPLOYEE = 'employee'
    USER_TYPES = (
          (USER_TYPE_EMPLOYEE, _('Employee')),
    )

    user_type = models.CharField(max_length=max(map(len, map(operator.itemgetter(0), CustomUser.USER_TYPES))), choices=CustomUser.USER_TPYES)

    @property
    def profile_model(self):
         return {
              USER_TYPE_EMPLOYEE: EmployeeProfile
         }[self.user_type]

    @property
    def profile(self):
         return self.profile_model.objects.get_or_create(user_id=self.pk)


class EmployeeProfile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, related_name='employee_profile')
于 2017-10-07T07:08:31.810 回答