【问题标题】:Setting Django admin permissions programmatically以编程方式设置 Django 管理员权限
【发布时间】:2012-06-01 15:26:21
【问题描述】:

我正在开发的 Django 网站可以让用户注册一个帐户。为了给他们提供一些编辑功能,我使用了内置的 Django admin。但是,我遇到了一个问题:用户注册后,他们在 Django 管理员中没有任何权限,甚至没有查看权限。因此我的问题是:我如何在代码中为相关模型的用户分配管理员权限,就像在管理员中编辑用户时我可以在“用户权限”部分手动分配它们一样?我已经尝试使用自定义 ModelAdmin 类使用 usual has_xxx_permissions(),但这没有用。所以我的猜测是我忽略了一些明显的东西。有什么想法吗?

【问题讨论】:

标签: django django-admin


【解决方案1】:

https://docs.djangoproject.com/en/dev/topics/auth/default/#permissions-and-authorization

new_user.user_permissions.add(permission1, permission2, etc...)

【讨论】:

  • 只有user.user_permissions.add() 为我工作。如果我只尝试user.permissions.add(),Django 1.4 提出了AttributeError: 'User' object has no attribute 'permissions'
【解决方案2】:

出于您的目的,将所有新用户分配到特定组,然后为该组提供用户所需的所有权限可能会更容易、更有效。该组的任何成员也将继承这些权限。

您可以在管理员中创建组并为其分配权限。然后,您只需在注册码中添加如下内容即可。

try:
    group = Group.objects.get(name='The User Group')
except Group.DoesNotExist:
    # group should exist, but this is just for safety's sake, it case the improbable should happen
    pass
else:
    user.groups.add(group)

【讨论】:

  • 我想可以通过这种方式完成,但是直接将权限应用到用户对我来说似乎“更好”(好吧,可能只是口味问题)。但对于其他用例,我会记住这一点。
  • @Timo 我完全一样;尽管理论上一个组更优雅,但要确保它到位是另一回事。我想当我需要做更多这类事情时,我会切换到小组,但现在我会坚持直接烫发。
  • 实际上,dgel 的代码示例(链接到below)改变了我的想法。它是组!
【解决方案3】:

dgel 的回答为我指明了为我找到可行解决方案的方向。从本质上讲,他似乎在暗示的是:

  1. 为您要为其设置权限的模型检索ContentType。在这种情况下,内容类型是一个包含information about a Django model 的对象。
  2. 使用Permission.objects.get() 创建一个Permission 对象,该对象包含内容类型和您希望在管理员中允许的操作。这里唯一的困难是找出codename 参数,对于管理员权限,该参数由操作(“添加”、“更改”或“删除”)、下划线和模型名称组成。因此,如果您有一个名为 Foo 的模型并且您想为其创建所有权限,您将需要 3 个权限,每个权限包含您的 Foo 模型的内容类型以及代码名称 add_foochange_foo、和delete_foo
  3. 使用user.user_permissions.add(permission) 分配这些权限。

转到 dgel 对 code examples 的回答。查看现有 Django 数据库的身份验证应用程序 (manage.py dumpdata auth) 的数据转储,也让我深入了解了权限的内部工作原理。

【讨论】:

    【解决方案4】:

    自从我在 Google 上找到这个问题后,我会准确地回答您的问题。我将通过组展示我在 Django 1.9 中所做的事情,然后向用户展示如何做。

    从 django.contrib.auth.models 导入组,权限 组,__ = Group.objects.get_or_create(name='my_group')

    permissions = Permission.objects.all()
    for p in permissions:
        group.permissions.add(p)
    group.save()
    

    很容易适应用户:

    from django.contrib.auth.models import Permission
    permissions = Permission.objects.all()
    for p in permissions:
        youruser.user_permissions.add(p)
    youruser.save()
    

    我更喜欢组,因为您将来可能会添加权限,并且可以只添加到组而不是重新执行所有用户。

    【讨论】:

      【解决方案5】:

      从 Django 1.6 开始:

      每个用户都有一个多对多字段user_permissions 到权限 - 您可以为此添加权限:

      your_user.user_permissions.add(permission)
      

      v1.6 文档:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-27
        • 2020-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        • 2022-01-01
        相关资源
        最近更新 更多