3

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

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 之外)。是否有一个简单的钩子可以在没有可怕的黑客攻击的情况下删除这些超链接?我是一位经验丰富的 django 开发人员,所以如果你能指出我正确的方向(如果有的话),我将能够实现细节或确定它现在不值得。

4

1 回答 1

1

通过覆盖 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

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

于 2014-09-09T02:44:12.077 回答