django用户模型 - 我什么时候需要它?

时间:2013-06-21 16:30:46

标签: python django django-models django-users

我有一个理解探测器:

我想为我的页面创建用户个人资料,该页面将包含许多属性。但由于我是django的auth用户模型的新手,我不知道我是否可以使用我为用户配置文件设置的新属性来扩展该模型。例如地址,年龄,......

如果没有,为什么用户模型在那里?它仅用于auth目的吗?如何处理和区分这两个用户模型?

示例案例:
用户想登录,我用auth的用户模型检查权限,并设置django的用户模型和我的用户模型之间的某种关系?我只是有点困惑

3 个答案:

答案 0 :(得分:2)

我将尝试从pre-django 1.5

的角度来解释

django的auth模型为您提供了一系列“便利”方法,如登录,注销,密码重置等,可以无缝工作。拥有更多字段是一种非常常见的情况 - 因此,一种方法是创建一个userprofile模型,该模型来自django auth用户模型的inherits,或者具有OneToOne关系。这样,您就不必重新实现一些已经实现的功能。此外,软件包中还有groupspermissions个模型,这些模型在用户权限方面添加了一整套功能。

示例:

 from django.contrib.auth.models import User
 class MyCustomProfile(User):
     #inherits all the attributes of default `User` models
     #additional models here. 

OR

 from django.contrib.auth.models import User
 class MyCustomProfile(models.Model):
     user = models.OneToOneField(User) 
     #additional models here. 

这样,您可以使用所有功能并在其上构建。

这在django-1.5中有所改变,它允许用户拥有自定义字段,这使您无需在现有UserProfile模型之上创建User模型。

答案 1 :(得分:1)

从Django 1.5开始,您可以使用自定义字段创建自己的用户模型。并告诉Django使用该模型进行身份验证。

文档链接:Custom User Model

<强>更新 如果您使用的是Django 1.4,那么django-primate可以帮助您定义自定义用户模型。

答案 2 :(得分:1)

从用户模型中派生您的课程。

from django.contrib.auth.models import User

class MyCustomUser( User ):
    # my properties here
    # my custom methods here

然后,您需要一个自定义后端来处理传递自定义用户类而不是常规用户,以便您可以访问该自定义用户类的属性。

from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import check_password
from my.app.models import MyCustomUser

class CustomUserModelBackend(ModelBackend):
    def authenticate(self, username=None, password=None):
        try:
            user = MyCustomUser.objects.get(username=username)
            if user.check_password(password):
                return user
        except Player.DoesNotExist:
            return None
        return None #Password was wrong

    def get_user(self, user_id):
        try:
            return MyCustomUser.objects.get(pk=user_id)
        except Player.DoesNotExist:
            return None 

然后将后端添加到AUTHENTICATION_BACKENDS中的settings.py元组。您可以进一步自定义它,这是一个简单实现。