1

我有一个理解问题:

我想为我的页面创建用户配置文件,该页面将具有许多属性。但是由于我是 django 身份验证的用户模型的新手,我不知道我是否可以使用我为用户配置文件设置的新属性来扩展该模型。例如地址,年龄,...

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

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

4

3 回答 3

2

我将尝试从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模型。

于 2013-06-21T16:46:43.847 回答
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_BACKENDSsettings.py. 您可以进一步自定义它,这是一个简单的实现。

于 2013-06-21T16:44:42.010 回答
1

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

文档链接:自定义用户模型

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

于 2013-06-21T16:44:04.040 回答