Python ';选项';对象没有属性';获取所有字段名称';

Python ';选项';对象没有属性';获取所有字段名称';,python,django,python-2.7,django-admin,Python,Django,Python 2.7,Django Admin,在我的django管理员中,我试图使模型不可编辑 因此,我正在覆盖admin.ModelAdmin的获取只读字段的方法 这是我的代码 @admin.register(SMSTemplate) class SMSTemplateAdmin(admin.ModelAdmin): list_display=['title', 'json', 'note'] formfield_overrides = { JSONField: {'widget': PrettyJSO

在我的
django管理员
中,我试图使
模型
不可编辑

因此,我正在覆盖
admin.ModelAdmin
获取只读字段的方法

这是我的代码

@admin.register(SMSTemplate)
class SMSTemplateAdmin(admin.ModelAdmin):
    list_display=['title', 'json', 'note']
       formfield_overrides = {
       JSONField: {'widget': PrettyJSONWidget }
    }

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

    def get_readonly_fields(self, request, obj=None):
        return self.model._meta.get_all_field_names()
但我面临一个错误。我在这里粘贴错误

'Options' object has no attribute 'get_all_field_names'

知道为什么吗?

可能是因为您使用的是django 1.10<在此版本中,代码>获取所有字段名称
。使用
get\u字段

def get_readonly_fields(self, request, obj=None):
    return [f.name for f in self.model._meta.get_fields()]
或用于完全兼容的版本

from itertools import chain

def get_readonly_fields(self, request, obj=None):
    return list(set(chain.from_iterable(
        (field.name, field.attname) if hasattr(field, 'attname') else (field.name,)
        for field in self.model._meta.get_fields()
        # For complete backwards compatibility, you may want to exclude
        # GenericForeignKey from the results.
        if not (field.many_to_one and field.related_model is None)
    )))

我收到此错误-->类型错误:hasattr():属性名称必须为string@AdilMalik你是抄袭了我的答案还是只是用它作为例子?。因为这段代码是从文档中提取出来的,并且可以正常工作。告诉我你哪里出了这个问题?