Wagtail ModelAdmin内联?

9
我正在使用wagtails的ModelAdmin模块(与Django ModelAdmin不同)将自定义Order模型添加到wagtail管理界面。该模型具有指向自定义Address模型的外键。
我希望在InspectView中(已启用)像在Django的管理界面中一样显示Address模型作为内联显示。目前它显示字符串表示形式。

很久以前就有人问过这个问题了,但是我很好奇你解决了吗?这可能是未来用户的好答案。或者,如果这个问题能提供一些关于你的模型结构的更多信息,那么未来的回答会更好。谢谢。 - LB Ben Johnston
2个回答

2

背景

您需要通过继承 ModelAdmin 类来创建一个类,并声明与该 ModelAdmin 相关联的模型。这是 ModelAdmin 的基础知识,您可以在 文档 中找到相关信息。此外,有关查看检查基础知识的内容可以在 这份文档 中找到。

class OrderAdmin(ModelAdmin):
    model = Order
    inspect_view_enabled = True
    inspect_view_fields = (
        'id',
        'date',
    )

我有一个名为Order的模型,我需要在wagtail检查视图中仅显示iddate。同时,我还有一个与Order模型存在一对一关系的Address模型。我需要在检查视图中显示来自该Addresscity

回答

但是如果只是像下面这样添加新字段,它将会报错,因为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
    )

现在你需要做的是获取与订单相关联的“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)

-1

我并不经常使用InspectView,但它将模型表示为一个渲染的模板,没有字段等。因此,也许你可以定义自己的模板,并从Order中调用自定义属性{{ value.bound_blocks.order.full_addres }}。

希望这对你有所帮助,

罗伯特


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接