10

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

4

5 回答 5

8

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

new_user.user_permissions.add(permission1, permission2, etc...)
于 2012-06-01T15:34:05.760 回答
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)
于 2012-06-01T15:50:54.940 回答
3

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

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

前往 dgel 的代码 示例答案。查看manage.py dumpdata auth现有 Django 数据库的身份验证应用程序 ( ) 的数据转储也让我对权限的内部工作有了深入的了解。

于 2012-06-02T15:58:37.137 回答
2

自从我在 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()

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

于 2017-01-10T16:16:14.927 回答
1

从 Django 1.6 开始:

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

your_user.user_permissions.add(permission)

v1.6 文档:

于 2014-02-05T16:12:01.067 回答