以编程方式设置Django管理员权限

时间:2012-06-01 15:26:22

标签: django django-admin

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

5 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:5)

出于您的目的,将所有新用户分配到特定组可能会更加轻松高效,然后为该组授予用户所需的所有权限。该组的任何成员也将继承这些权限。

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

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)

答案 2 :(得分:3)

dgel的回答指出了我为我提供工作解决方案的方向。基本上,他似乎建议的是:

  1. 为要为其设置权限的模型检索ContentType。在此上下文中,内容类型是包含information about a Django model
  2. 的对象
  3. 使用Permission.objects.get()创建一个Permission对象,其中包含内容类型以及您希望在管理员内部允许的操作。这里唯一的困难是找出codename参数,对于管理员权限,该参数由一个动作(“添加”,“更改”或“删除”),一个下划线和模型名称组成。因此,如果您有一个名为Foo的模型并且您想要为其创建所有权限,则需要3个权限,每个权限都包含Foo模型的内容类型以及代码名称{{1} },add_foochange_foo
  4. 使用delete_foo分配这些权限。
  5. 转到dgel对code examples的回答。查看现有Django数据库的auth app(user.user_permissions.add(permission))的数据转储,也为我提供了对权限内部工作的深入了解。

答案 3 :(得分:1)

从Django 1.6开始:

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

your_user.user_permissions.add(permission)

v1.6文档:

答案 4 :(得分:1)

我会在谷歌发现这个问题之后完全回答你的问题。我将在团队中展示我在Django 1.9中所做的事情,然后向用户展示如何做到这一点。

来自django.contrib.auth.models导入组,权限     group,__ = 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()

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