2017-10-07 106 views
0

我有一个自定义的用户设置是这样的:确定类型的登录用户

class CustomUser(AbstractUser): 
    pass 

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

在settings.py,我然后添加以下重点:

AUTH_USER_MODEL = 'myapp.CustomUser' 

我要确定谁登录将其重定向到适当的观点或网址。

在我的帐户激活视图,记录他们在我将它们重定向到相应页面这样

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

但这并不觉得从那之后,我需要在其他地方一样显示使用该模板中的另一个配置文件页面链接。

如何在视图和模板中更好地识别普通用户和员工?

回答

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') 
+0

我承认我花了一些时间来了解您的方法。我愿意为此付出代价,但请您指出我采用这种方法的完整解决方案? – Animesh

+1

@Animesh我提供的代码是使用通用FK的替代品,功能齐全。如果您想要添加新的配置文件模型,您应该1.创建一个新的模型,如上面的'EmployeeProfile',2.在USER_TYPES中添加新的用户类型3.在由'profile_model'方法返回的字典中添加一个项目以返回您的新个人资料模型。 –

+0

感谢您的指导,我会研究这一点。 – Animesh

1

扩展用户模型以创建员工模型的想法对我来说并不好。相反,您可以使用Django Group Model并将用户添加到员工组。这样,您可以轻松检查用户是否属于Employee组。

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