无论我如何尝试,我都不能像在文档中那样使用命名方法作为字段名。最后,我将使该方法检索ForeignKey的字段,但现在我只想弄清楚我在这个简化示例中做错了什么。
在docs.djangoproject.com的这个例子中,他们正在使用类方法'view_birth_date',就像我使用'get_test'(下面)一样,甚至通过我在fieldsets
而不是fields
中使用它,它应该工作。
我已经尝试过fields =
和fieldsets =
,我得到相同的结果(错误)。它无法找到字段'get_test'。我也试过把def get_test(self)
放在fieldsets =
上面,但没有什么区别。
它应该与文档中的工作相同,但事实并非如此。我做错了什么?
这应该工作:
@admin.register(Feeddata)
class AdminFeeddata(admin.ModelAdmin):
"""Feeddata admin."""
list_display = ['id', 'eventtime', 'feed']
fieldsets = [
('Meta', {
'fields': ['feed', 'eventtime', 'get_test']
}),
('JSON Data', {
'fields': ('json_data', )
}),
]
# pylint: disable=no-self-use
def get_test(self):
"""Test string."""
return 'test'
但是我得到一个错误:
FieldError at /admin/feeder/feeddata/fff1d764-52cd-499f-9ae9-b1251a806b5b/change/
Unknown field(s) (get_test) specified for Feeddata. Check fields/fieldsets/exclude attributes of class AdminFeeddata.
Request Method: GET
Request URL: http://localhost:8000/admin/feeder/feeddata/fff1d764-52cd-499f-9ae9-b1251a806b5b/change/
Django Version: 3.1.6
Exception Type: FieldError
Exception Value:
Unknown field(s) (get_test) specified for Feeddata. Check fields/fieldsets/exclude attributes of class AdminFeeddata.
Exception Location: /usr/local/lib/python3.8/site-packages/django/contrib/admin/options.py, line 711, in get_form
Python Executable: /usr/local/bin/python
Python Version: 3.8.7
Python Path:
['/code',
'/code',
'/usr/local/bin',
'/usr/local/lib/python38.zip',
'/usr/local/lib/python3.8',
'/usr/local/lib/python3.8/lib-dynload',
'/usr/local/lib/python3.8/site-packages']
Server time: Thu, 18 Feb 2021 23:44:12 -0800
忘了添加obj参数也就是get_test方法中的实例模型
@admin.register(Feeddata)
class AdminFeeddata(admin.ModelAdmin):
"""Feeddata admin."""
list_display = ['id', 'eventtime', 'feed']
fieldsets = [
('Meta', {
'fields': ['feed', 'eventtime', 'get_test']
}),
('JSON Data', {
'fields': ('json_data', )
}),
]
# pylint: disable=no-self-use
def get_test(self, obj):
"""Test string."""
return 'test'
这里有一个文档中的例子:
from django.contrib import admin
class AuthorAdmin(admin.ModelAdmin):
fields = ('name', 'title', 'view_birth_date')
def view_birth_date(self, obj):
return obj.birth_date
view_birth_date.empty_value_display = '???'
为了在表单字段集中显示一个自定义字段,这是一个方法的结果,您应该将它传递给readonly_fields
。将get_test
添加到readonly_fields
列表中,如下所示。
@admin.register(Feeddata)
class AdminFeeddata(admin.ModelAdmin):
"""Feeddata admin."""
readonly_fields = ["get_test"] #new
list_display = ['id', 'eventtime', 'feed']
fieldsets = [
('Meta', {
'fields': ['feed', 'eventtime', 'get_test']
}),
('JSON Data', {
'fields': ('json_data', )
}),
]
# pylint: disable=no-self-use
def get_test(self):
"""Test string."""
return 'test'