gpt4 book ai didi

python - 为什么 Django 没有查看权限?

转载 作者:太空狗 更新时间:2023-10-29 22:25:50 25 4
gpt4 key购买 nike

我有一个活跃的 Django 项目,客户支持团队使用该项目的管理面板。 Django 缺少 view 权限,因此我必须将更改权限分配给客户支持团队,这有点危险。我有一些模型,由于安全问题,客户支持团队只需要查看访问权限而不需要更改访问权限。为什么 Django 中缺少 view 权限?有什么解决方法吗?

最佳答案

这里有一个解决方法。

模型

通过从 mixin 继承它们来简单地创建具有 View 权限的模型:

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

最后,只需将特定模型的 view 权限分配给 Django Admin 中的任何用户或组。

关于python - 为什么 Django 没有查看权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33206304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com