You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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自然会认为这是一个不存在的模型字段,从而报错。

解决方案

只需要两步就能修复这个问题:

  1. 将pretty_user添加到readonly_fields中
  2. 保持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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 11:22:48