整个模型为只读

jul*_*ria 14 django readonly django-models django-admin

有没有办法在django管理员中使模型只读?但我的意思是整个模型.那么,没有添加,没有删除,没有变化,只看到对象和字段,一切都是只读的?

Dan*_*air 11

ModelAdmin提供了钩子get_readonly_fields() - 以下是未经测试的,我的想法是以ModelAdmin的方式确定所有字段,而不会遇到只读字段本身的递归:

from django.contrib.admin.util import flatten_fieldsets

class ReadOnlyAdmin(ModelAdmin):
    def get_readonly_fields(self, request, obj=None):
        if self.declared_fieldsets:
            fields = flatten_fieldsets(self.declared_fieldsets)
        else:
            form = self.get_formset(request, obj).form
            fields = form.base_fields.keys()
        return fields
Run Code Online (Sandbox Code Playgroud)

然后子类/ mixin这个管理员,它应该是一个只读管理员.

对于添加/删除,并使其按钮消失,您可能还想添加

    def has_add_permission(self, request):
        # Nobody is allowed to add
        return False
    def has_delete_permission(self, request, obj=None):
        # Nobody is allowed to delete
        return False
Run Code Online (Sandbox Code Playgroud)

PS:在ModelAdmin中,如果has_change_permission(查找或您的覆盖)返回False,则不会进入对象的更改视图 - 甚至不会显示指向它的链接.如果它确实很酷,并且默认的get_readonly_fields()检查了更改权限并在这种情况下将所有字段设置为只读,如上所述.这样非变换者至少可以浏览数据......鉴于当前的管理结构假设view = edit,正如jathanism指出的那样,这可能需要在添加/更改/删除之上引入"查看"权限...

编辑:关于设置所有字段只读,也未经测试但看起来很有希望:

readonly_fields = MyModel._meta.get_all_field_names()
Run Code Online (Sandbox Code Playgroud)

编辑:这是另一个

if self.declared_fieldsets:
    return flatten_fieldsets(self.declared_fieldsets)
else:
    return list(set(
        [field.name for field in self.opts.local_fields] +
        [field.name for field in self.opts.local_many_to_many]
    ))
Run Code Online (Sandbox Code Playgroud)

  • 在Django 1.11中不起作用 - AttributeError:'ReadOnlyAdmin'对象没有属性'declared_fieldsets' (2认同)