1

在我的模型中,我的模型具有Document模型的外键Library。当我在 Django 管理站点中时,我想Library在创建新的Document.

管理站点,添加新文档的视图

我尝试的是通过子类化django.contrib.admin.ModelAdmin和删除更改/删除权限来删除删除和编辑权限

@admin.register(Library)
class LibraryAdmin(admin.ModelAdmin):
    def has_delete_permission(self, request, obj=None):
        return False

    def has_change_permission(self, request, obj=None):
        return False

这使不需要的按钮消失,但也完全阻止了编辑和删除的可能性Libraries,这不是我想要的。有没有办法仅在模型编辑表单中禁用这些操作?

4

2 回答 2

1

另一个类似于 schwobaseggl 的变体是:

@admin.register(Library)
class LibraryAdmin(admin.ModelAdmin):
    def has_delete_permission(self, request, obj=None):
        r = super(LibraryAdmin, self).has_delete_permission(request,obj)
        if r:
            referer = request.path
            
            # Here we can check all the forms were we don`t want to allow Library deletion
            if 'documentappname/document/' in referer:
                r = False
        
        return r

优点:您只需制作一个功能,您可以避免在不同型号的许多编辑页面中删除。
缺点:它依赖于您的管理应用程序的 url 模式,因此,如果它更改应用程序或模型名称(奇怪但可能),您将不得不更改它。另一个缺点是不那么细粒度:您不能根据要删除的对象的某些属性来选择避免删除。你可以用 schwobaseggl 的提议来做到这一点。

于 2021-08-19T07:56:32.843 回答
1

您可以在文档管理员中标记请求:

def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
    request._editing_document = object_id is not None  # add attribute
    return super(DocumentAdmin, self).changeform_view(request, object_id=object_id, form_url=form_url, extra_context=extra_context)

现在您可以在相关管理员中访问该标志:

@admin.register(Library)
class LibraryAdmin(admin.ModelAdmin):
    def has_delete_permission(self, request, obj=None):
        if getattr(request, '_editing_document', False):  # query attribute
            return False
        return super(LibraryAdmin, self).has_delete_permission(request, obj=obj)
于 2018-07-25T09:23:52.843 回答