Wagtail ModelAdmin inline?



我正在使用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检查视图中显示iddate。此外,我有一个与Order模型具有一对一关系的Address模型。我需要在检查视图中显示Address中的city

答案

但如果像下面这样添加新字段,就会出现错误,因为wagtailOrder模型中找不到一个名为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

最新更新