如何在Django Admin修改表单中正确添加可调用自定义字段?
解决Django Admin中自定义字段在修改表单崩溃的问题
我来帮你梳理下问题的核心原因,以及对应的解决办法:
问题根源
你遇到的Unknown field(s) (pretty_user) specified for Model1错误,本质是因为Django Admin在处理修改表单(change_form)时,会校验fields里的字段是否是模型的实际数据库字段——除非这个字段被添加到readonly_fields列表中。
你看第二个能正常运行的Model2Admin例子,核心区别就是把自定义的render_logo加到了readonly_fields里,告诉Django Admin这是一个不需要对应数据库字段的只读自定义字段;而第一个Model1Admin里,你只在list_display里用了pretty_user,却没把它加入readonly_fields,直接放到get_fields返回的字段列表里,Django自然会认为这是一个不存在的模型字段,从而报错。
解决方案
只需要两步就能修复这个问题:
- 将
pretty_user添加到readonly_fields中 - 保持
get_fields里的字段配置不变(或者按需调整顺序)
修改后的Model1Admin代码如下:
@admin.register(Model1) # 注:你原代码里写的@admin.register(Model1Admin)应该是笔误,需注册实际模型类(比如Model1) class Model1Admin(admin.ModelAdmin): # 把pretty_user加入readonly_fields readonly_fields = ['id', 'configuration', 'ip_address', 'downloads', 'user', 'downloaded', 'pretty_user'] list_display = ['id','downloads','pretty_user','downloaded',] def pretty_user(self, obj): return f"{obj.user.get_full_name()} - ({obj.user.email})" pretty_user.short_description = 'User' def get_fields(self, request, obj=None): fields = ('id', 'downloads', 'pretty_user', 'downloaded') return fields
补充说明
list_display本身就支持直接使用可调用方法,所以你之前在列表视图里能正常显示没问题;但修改表单的字段校验更严格,必须通过readonly_fields来声明自定义方法字段。- 如果你需要让这个自定义字段在修改表单里可编辑(显然你这里不需要,因为是用户信息的格式化展示),那就要用其他方式(比如自定义表单字段),但你的场景里只读就足够了。
内容的提问来源于stack exchange,提问作者everspader
相关产品推荐
相关产品推荐

