我有一个理解问题:
我想为我的页面创建用户配置文件,该页面将具有许多属性。但是由于我是 django 身份验证的用户模型的新手,我不知道我是否可以使用我为用户配置文件设置的新属性来扩展该模型。例如地址,年龄,...
如果没有,为什么用户模型在那里?它仅用于身份验证目的吗?如何处理和区分这两个用户模型?
示例案例:
用户想登录,我用auth的用户模型检查权限,并在django的用户模型和我的用户模型之间设置一些关系?我只是有点困惑
我有一个理解问题:
我想为我的页面创建用户配置文件,该页面将具有许多属性。但是由于我是 django 身份验证的用户模型的新手,我不知道我是否可以使用我为用户配置文件设置的新属性来扩展该模型。例如地址,年龄,...
如果没有,为什么用户模型在那里?它仅用于身份验证目的吗?如何处理和区分这两个用户模型?
示例案例:
用户想登录,我用auth的用户模型检查权限,并在django的用户模型和我的用户模型之间设置一些关系?我只是有点困惑
我将尝试从pre-django 1.5的角度来解释
django 的身份验证模型为您提供了一组“方便”的方法,如登录、注销、密码重置等,它们可以无缝地工作。拥有更多字段是一个非常常见的场景 - 因此一种方法是创建一个用户配置文件模型,该模型inherits
来自 django auth 用户模型,或者具有OneToOne
相同的关系。这样,您不必重新实现一些已经实现的功能。此外,包中还有一些groups
模型permissions
,它们在用户权限方面增加了一整层功能。
例子:
from django.contrib.auth.models import User
class MyCustomProfile(User):
#inherits all the attributes of default `User` models
#additional models here.
或者
from django.contrib.auth.models import User
class MyCustomProfile(models.Model):
user = models.OneToOneField(User)
#additional models here.
这样,您可以使用所有功能并在其之上进行构建。
这在 django-1.5 中有所改变,它允许用户拥有自定义字段,这使您无需在UserProfile
现有模型之上创建User
模型。
从用户模型派生您的类。
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
. 您可以进一步自定义它,这是一个简单的实现。
从 Django 1.5 开始,您可以使用自定义字段创建自己的用户模型。并告诉 Django 使用该模型进行身份验证。
文档链接:自定义用户模型
更新: 如果您使用的是 Django 1.4,那么django-primate可以帮助您定义自定义用户模型。