如何正确地将自定义字段添加为 Django 管理更改表单的可调用项?
How to properly add a custom field as a callable to Django admin change form?
我正在尝试将自定义字段 (pretty_user
) 添加到模型的管理页面,以一种很好的方式显示用户信息。我将模型作为可调用项直接添加到 ModelAdmin
class 中。这在 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>')
我已尽一切努力让它工作,但我看不到问题所在。有什么想法吗?
render_logo custom_fields 有效,因为您将此字段设置为 readonly_fields.
如果您将 pretty_user 字段设置为 readonly_field,那么它也有效。
readonly_fields = ['id', 'configuration', 'ip_address', 'downloads', 'user','downloaded', 'pretty_user']
否则您将创建一个 模型表单,您可以在其中添加任何自定义字段。
我正在尝试将自定义字段 (pretty_user
) 添加到模型的管理页面,以一种很好的方式显示用户信息。我将模型作为可调用项直接添加到 ModelAdmin
class 中。这在 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>')
我已尽一切努力让它工作,但我看不到问题所在。有什么想法吗?
render_logo custom_fields 有效,因为您将此字段设置为 readonly_fields.
如果您将 pretty_user 字段设置为 readonly_field,那么它也有效。
readonly_fields = ['id', 'configuration', 'ip_address', 'downloads', 'user','downloaded', 'pretty_user']
否则您将创建一个 模型表单,您可以在其中添加任何自定义字段。