【问题标题】:How to properly add a custom field as a callable to Django admin change form?如何正确添加自定义字段作为 Django 管理员更改表单的可调用项?
【发布时间】:2021-09-09 08:55:04
【问题描述】:

我正在尝试将自定义字段 (pretty_user) 添加到模型的管理页面,以一种很好的方式显示用户信息。我将模型添加为直接在ModelAdmin 类中的可调用对象。这在 list_display 视图中运行良好,但在 change_form 视图中完全崩溃。

@admin.register(Model1Admin)
class Model1Admin(admin.ModelAdmin):
    readonly_fields = [
        'id', 'configuration', 'ip_address', 'downloads', 'user', 'downloaded']

    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

错误回溯:

Unknown field(s) (pretty_user) specified for Model1. Check fields/fieldsets/exclude attributes of class Model1Admin.

问题是我在 ModelAdmin 中为其他模型添加自定义字段作为可调用对象的结构相同,它们都可以完美地工作。这是我将render_logo 添加为自定义字段的示例:

@admin.register(Model2Admin)
class Model2Admin(admin.ModelAdmin):
    list_display = ('id', 'name', 'name_long', 'created', 'updated', 'render_logo')
    readonly_fields = ['id', 'created', 'updated', 'render_logo']

    def get_fields(self, obj):
        fields = ('render_logo', 'id', 'name', 'name_long', 'created', 'updated')
        return fields
    
    def render_logo(self, m: 'Model2'):
        if m.logo is not None:
            return format_html(f'<img src="data:image/png;base64,{m.logo}" />')
        else:
            return format_html('<span>No logo</span>')

我已尽一切努力使其正常工作,但我看不到问题所在。有什么想法吗?

【问题讨论】:

  • 分享错误回溯
  • @Amin,谢谢,我忘了。刚刚编辑了帖子。
  • 删除get_fields 方法。您已经指定了字段。
  • 我没有。我可以使用或不使用get_fields 方法指定fields,但它仍然不起作用。
  • 也分享你的模型

标签: python django django-admin


【解决方案1】:

render_logo custom_fields 有效,因为您将此字段设置为 readonly_fields

如果您将 pretty_user 字段设置为 readonly_field,那么它也可以工作。

readonly_fields = ['id', 'configuration', 'ip_address', 'downloads', 'user','downloaded', 'pretty_user']

否则,您将创建一个 modelform,您可以在其中添加任何自定义字段。

【讨论】:

  • 非常感谢!我在墙上撞了好久。
猜你喜欢
  • 2013-01-31
  • 2019-02-03
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
  • 2019-05-08
  • 1970-01-01
  • 2018-01-23
相关资源
最近更新 更多