Python 为什么Django没有查看权限?
我有一个活跃的Django项目,客户支持团队使用管理面板。Django缺少Python 为什么Django没有查看权限?,python,django,django-models,django-admin,django-views,Python,Django,Django Models,Django Admin,Django Views,我有一个活跃的Django项目,客户支持团队使用管理面板。Django缺少查看权限,因此我必须将更改权限分配给客户支持团队,这有点危险。我有一些模型,由于安全问题,客户支持团队只需要查看访问权限,而不需要更改访问权限。为什么Django中缺少视图权限?有什么解决办法吗?我认为这应该是可行的: 1.添加“查看”权限,请参见 2.自定义“更改”权限: class FooAdmin(ModelAdmin): def has_change_permission(self, request, ob
查看
权限,因此我必须将更改权限分配给客户支持团队,这有点危险。我有一些模型,由于安全问题,客户支持团队只需要查看访问权限,而不需要更改访问权限。为什么Django中缺少视图
权限?有什么解决办法吗?我认为这应该是可行的:
1.添加“查看”权限,请参见
2.自定义“更改”权限:
class FooAdmin(ModelAdmin):
def has_change_permission(self, request, obj=None):
# user can view the change list
if not obj and request.user.has_perm('myapp.view_foo'):
return True
# user can view the change form and change the obj
return request.user.has_perm('myapp.change_foo')
这里有一个解决办法
型号
通过从mixin继承模型,只需创建具有查看权限的模型:
class ViewPermissionsMixin(models.Model):
"""
Mixin adds view permission to model.
"""
class Meta:
abstract=True
default_permissions = ('add', 'change', 'delete', 'view')
示例模型:
class ExampleModel(ViewPermissionsMixin):
name = models.CharField(max_length=255)
class Meta(ViewPermissionsMixin.Meta):
abstract = False
这将添加可分配给特定用户/组的查看权限。但是如果没有适当的管理修改,这样的许可是无用的
管理员
这是为您的管理员准备的mixin:
class AdminViewMixin(admin.ModelAdmin):
def has_perm(self,user,permission):
"""
Usefull shortcut for `user.has_perm()`
"""
if user.has_perm("%s.%s_%s" % (self.model._meta.app_label,permission,self.model.__name__.lower(),)):
return True
return False
def has_module_permission(self, request): # Django 1.8
pass
def has_change_permission(self, request, obj=None):
"""
Necessary permission check to let Django show change_form for `view` permissions
"""
if request.user.is_superuser:
return True
elif self.has_perm(request.user,'change'):
return True
elif self.has_perm(request.user,'view'):
return True
return super(AdminMixin, self).has_change_permission(request, obj)
def get_readonly_fields(self, request, obj=None):
"""
Turn each model field into read-only for `viewers`
"""
all_model_fields = []
for field in self.model._meta.fields:
# TODO in Django 1.8 use ModelAdmin.get_fields()
if not field.auto_created \
and (not hasattr(field,'auto_now_add') or not field.auto_now_add) \
and (not hasattr(field,'auto_now') or not field.auto_now) \
:
all_model_fields.append(field.name)
if request.user.is_superuser:
return self.readonly_fields
elif self.has_perm(request.user,'change'):
return self.readonly_fields
elif self.has_perm(request.user,'view'):
return all_model_fields
return self.readonly_fields
def change_view(self, request, object_id, extra_context=None):
"""
Disable buttons for `viewers` in `change_view`
"""
if request.user.is_superuser:
pass
elif self.has_perm(request.user,'change'):
pass
elif self.has_perm(request.user,'view'):
extra_context = extra_context or {}
extra_context['hide_save_buttons'] = True
return super(AdminViewMixin, self).change_view(request, object_id, extra_context=extra_context)
示例管理员:
@admin.register(models.ExampleModel)
class ExampleAdmin(AdminViewMixin):
list_display = ('name',)
pass
最后,只需为Django管理员中的任何用户或组分配特定模型的
view
权限 你的意思是想让管理员中的信息成为只读的吗?@marksweb:是的,但只针对特定的用户组。我不想让它在所有组中全局只读。没有人回答为什么缺少查看
权限的问题。我怀疑您使用自定义管理器,不可查看的对象首先会被过滤掉,因此不需要检查查看权限。但我不确定这是否适用于所有场景,例如相关模型。这是在2.1中添加的:我希望在不同的组之间分配不同的权限,如我对问题的评论中所述。user.has_perm()
将检查用户权限和组权限。它与django admin view权限[?