Chr*_* B. 6 django django-permissions
我在我的Django应用程序中定义了一个模型foo,如下所示:
class Bar(models.Model):
class Meta:
permissions = (
("view_bar", "Can view bars"),
)
Run Code Online (Sandbox Code Playgroud)
我已经跑manage.py syncdb了这个,果然,它出现在auth_permissions表格中:
id|name|content_type_id|codename
41|Can view bars|12|view_bar
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试将该权限添加到视图中的用户对象时,如下所示:
request.user.user_permissions.add('foo.view_bar')
Run Code Online (Sandbox Code Playgroud)
代码爆炸,出现以下异常:
invalid literal for int() with base 10: 'foo.view_bar'
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?
dge*_*gel 13
user_permissions.add正在添加到ManyToMany管理器.所以你需要添加实际的Permission对象本身:
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
content_type = ContentType.objects.get_for_model(Bar)
permission = Permission.objects.get(content_type=content_type, codename='view_bar')
request.user.user_permissions.add(permission)
Run Code Online (Sandbox Code Playgroud)
此外,您在测试时可能会遇到奇怪问题,因为还会为每个用户缓存权限.您可能希望在调用之前删除缓存has_perm:
if hasattr(user, '_perm_cache'):
delattr(user, '_perm_cache')
Run Code Online (Sandbox Code Playgroud)
通常,您可能希望编写一组辅助方法来处理所有这些内容,以便您可以轻松地以编程方式提供和撤消权限.你如何做到这将取决于你如何使用权限.
| 归档时间: |
|
| 查看次数: |
1760 次 |
| 最近记录: |