我正在使用wagtail的ModelAdmin模块(与Django ModelAdmin不同)向wagtail管理员添加自定义Order
模型。此模型具有自定义Address
模型的外键。
我想将Address
模型显示为InspectView
(我已经启用)中的内联(类似于django的管理)。当前它显示字符串表示。
背景
您必须通过继承ModelAdmin
类来创建一个类,并声明与该ModelAdmin
关联的模型。这是ModelAdmin
的基础知识,您可以在文档中找到它。此外,可以在本文档中找到Inspect View基础知识。
class OrderAdmin(ModelAdmin):
model = Order
inspect_view_enabled = True
inspect_view_fields = (
'id',
'date',
)
我有一个名为Order
的模型,我只需要在wagtail检查视图中显示id
和date
。此外,我有一个与Order
模型具有一对一关系的Address
模型。我需要在检查视图中显示Address
中的city
。
答案
但如果像下面这样添加新字段,就会出现错误,因为wagtail
在Order
模型中找不到一个名为city
的字段。
inspect_view_fields = (
'id',
'date',
'city',
)
wagtail如何解析字段
对于inspect_view_fields
数组中的每个字段,wagtail都会调用一个名为get_dict_for_field
的方法来获取该字段的相关标签和值。您可以轻松地覆盖此方法。重写之后,您应该告诉wagtail使用重写的方法。您可以按如下方式进行操作。
class OrderInspectView(InspectView):
def get_dict_for_field(self, field_name): # Override to support custom fields
# Do the implementation for custom fields
return super().get_dict_for_field(field_name)
class OrderAdmin(ModelAdmin):
model = Order
inspect_view_enabled = True
inspect_view_class = OrderInspectView # Tell wagtail to use our class instead of the default class
inspect_view_fields = (
'id',
'name',
'city', # Custom field
)
您现在需要做的是获取与Order
关联的Address
并将其返回。您可以使用self.instance
获取当前检查的Order
。
def get_dict_for_field(self, field_name):
if field_name == 'city':
qs = Address.objects.filter(order=self.instance.id)
value = str(qs[0].city) if len(qs) > 0 else '-'
return {
'label': 'City',
'value': value,
}
return super().get_dict_for_field(field_name)
我不经常使用InspectView,但它将模型表示为一个没有字段等的续订模板。因此,也许您可以定义自己的模板,并从其上的Order{{value.bound_block.Order.full_addres}}中调用自定义属性。
希望这有任何用处,
Robert