python - 扩展 Django 用户模型(使其在 request.user 中工作),Django 1.2.3

标签 python django model django-1.2

我想扩展用户模型,所以我可以放入一些额外的字段和函数(记住,不仅仅是字段,否则(好吧,仍然)我可以使用 get_profile(),我认为这是丑)。

我还想在 request.user 中使用新的扩展用户模型,如下所示:

扩展用户模型:

# imports etc

class CustomUser(User):
    extra_field = ...

    def extra_function(self):
        ...

        return ...

使用 View 示例:

# imports etc

def extra_function_view(request):
    print request.user.username
    print request.user.extra_field

    request.user.extra_function()

    return HttpResponse( ... )

上面的代码显然不起作用,因为 extra_field 和 extra_function 不在 User 模型中。

现在我找到了一种方法来完成此任务,使用身份验证后端,这有点复杂,而且我无法在 Django 1.2.3 中使用它。

AUTHENTICATION_BACKENDS = (
    'myproject.auth_backends.CustomUserModelBackend',
)
...

CUSTOM_USER_MODEL = 'accounts.CustomUser'

进一步尝试了一些其他方法,例如使用信号,但不起作用。对我来说,唯一的解决方案似乎是调整 Django 中的用户模型(这不是一个优雅的解决方案,调整 Django 的源代码,但在代码方面是一个简洁的解决方案)。

所以我正在寻找解决方案。以前有人这样做过吗?

现在谢谢

斯特凡

最佳答案

您调整身份验证后端的方向是正确的。

身份验证后端可以非常简单,这是我们在项目中使用的一个片段。

class LocalAccount(object):
    def authenticate(self, system=None, username=None, password=None):
        try:
            user = User.objects.get(system=system, alias=username)
            if user.check_password(password):
                return user
        except User.DoesNotExist:
            return None

    def get_user(self, user_id):
        'returns user'

    def get_all_permissions(self, user_obj):
        'returns user permissions'

    def has_perm(self, user_obj, perm):
        'verifies permission, remember you can hardcode these'

    def get_group_permissions(self, user_obj):
        return set() #We don't use this

    def has_module_perms(self, user_obj, app_label):
        return False

这允许您返回您想要返回的任何用户模型。只要您的用户模型基本上类似于 Django 的用户模型,您就不会遇到任何问题。

另请记住,扩展用户并包含应用程序将导致 Django 用户模型和您自己的用户模型都位于具有模型继承的数据库中。最好的选择是复制 Django User 模型并更改它。对于我们的项目,我们甚至没有在已安装的应用程序设置中包含“auth”。

这里的概念是Python duck typing 。只要您创建的 User 模型具有 Django 正在寻找的相同接口(interface)(方法、字段),它是否实际上是它指定的 User 类并不重要。

关于python - 扩展 Django 用户模型(使其在 request.user 中工作),Django 1.2.3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4314068/

相关文章:

python - 为什么这个迭代 Collat​​z 方法比它在 Python 中的递归版本慢 30%?

python - 使用 Django 还原更改名称后如何获取以前的对象值?

python - Django - AttributeError : 'NoneType' object has no attribute 'first_name'

Django 避免为现有数据库创建测试数据库

javascript - html View 中的 Angular 表达式为不同的表达式呈现相同的数据

python - 值错误 : too many values to unpack python 2. 7

python - 如何在GAE中的ndb模型中创建随机默认值?

python - 在 Windows 7 上安装 Light Table 编辑器

database - Web 应用程序模型原型(prototype)制作

python - Django:如何构建食堂菜单预订系统以避免同现预订?