有没有办法在django管理员中将模型设为只读?但我的意思是整个模型。因此,没有添加,没有删除,没有更改,只是将对象和字段视为只读?
ModelAdmin提供了钩子get_readonly_fields()-以下内容未经测试,我的想法是确定模型管理员执行此操作的所有字段,而不会涉及只读字段本身的递归:
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
然后子类化/混合该管理员,无论它应该是只读管理员。
对于添加/删除,并使它们的按钮消失,你可能还需要添加
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
PS:在ModelAdmin中,如果has_change_permission(查找或你的替代)返回False,则你无法进入对象的更改视图-甚至不会显示该对象的链接。如果这样做的话,实际上会很酷,并且默认的get_readonly_fields()检查了更改权限,并在这种情况下将所有字段设置为readonly,就像上面一样。这样,非更改者至少可以浏览数据…就像詹森斯指出,鉴于当前的管理结构假定view = edit,这可能需要在添加/更改/删除之上引入“查看”权限…
编辑:关于将所有字段设置为只读,也未经测试,但看起来很有希望:
readonly_fields = MyModel._meta.get_all_field_names()
编辑:这是另一个
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] ))