gpt4 book ai didi

django - 有没有办法从 django 管理更改列表上的对象中删除用户无权更改的超链接?

转载 作者:行者123 更新时间:2023-12-05 06:46:34 26 4
gpt4 key购买 nike

我目前正在我的自定义 django 管理类中使用 has_change_permission Hook 来实现行级权限的简单形式,并确定非 super 用户是否可以编辑特定对象,如下所示:

def has_change_permission(self, request, obj=None):
if obj is None or request.user.is_superuser or (obj and not obj.superuser_only): # (my model has a 'superuser_only' flag that gets set via fixtures, but its beyond the scope of this question)
return True
return False

这工作得很好:所有对象都显示给用户,但如果他们点击一个他们没有编辑权限的对象,那么他们就会被带到我的 403 页面,大概是因为 PermissionDenied 被引发了。然而,给他们一个指向拒绝权限页面的超链接似乎并不适合这种情况;我想显示对象,但不提供任何指向列表页面上编辑页面的超链接(如果他们试图手动使用对象的 URL,除了引发 PermissionDenied 之外)。是否有一个简单的钩子(Hook)来删除这些超链接而无需可怕的黑客攻击?我是一位经验丰富的 Django 开发人员,所以如果你能给我指出正确的方向(如果有的话),我将能够实现细节或确定它现在不值得。

最佳答案

通过覆盖 ModelAdmin 类(在我的 admin.py 文件中)中的默认 get_list_display_links 函数,我能够以相当直接的方式完成此操作:

def get_list_display_links(self, request, list_display):
if request.user.is_superuser:
if self.list_display_links or not list_display:
return self.list_display_links
else:
# Use only the first item in list_display as link
return list(list_display)[:1]
else:
# Ensures that no hyperlinks appear in the change list for non-superusers
self.list_display_links = (None, )
return self.list_display_links

请注意,我的代码为 super 用户维护超链接。如果您不想进行这种区分,则可以轻松地只使用函数的后半部分。

关于django - 有没有办法从 django 管理更改列表上的对象中删除用户无权更改的超链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14597145/

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