在不使用代码片段的情况下在非页面模型上渲染 Wagtail InlinePanel?
Render Wagtail InlinePanel on non-page model, without using snippet?
我已经定义了两个模型并将它们链接起来,如下所示。 Order
模型应使用 Wagtail InlinePanel 显示 OrderItems
。如果不将 Order
模型注册为片段,我如何才能 工作?
from wagtail.admin.edit_handlers import InlinePanel
from wagtail.core.models import Orderable
from wagtail.snippets.models import register_snippet
from modelcluster.fields import (
ParentalKey,
)
from modelcluster.models import ClusterableModel
@register_snippet
class Order(ClusterableModel):
panels = [
InlinePanel("items", label="Order items"),
]
def __str__(self):
return f"Order {self.id}"
def get_total_cost(self):
return sum(item.get_cost() for item in self.items.all())
class OrderItem(Orderable):
order = ParentalKey(
Order,
related_name="items",
on_delete=models.CASCADE,
blank=False,
)
product = models.CharField(max_length=255)
price = models.DecimalField(max_digits=10, decimal_places=2)
quantity = models.PositiveIntegerField(default=1)
panels = [
FieldPanel("product"),
FieldPanel("price"),
FieldPanel("quantity"),
]
在找到 models.py
的同一个应用程序中创建 wagtail_hooks.py
。然后,在 wagtail_hooks.py
中,做这样的事情(这里 OrderAdmin
class 中有很多额外内容供您查看 - 请注意,并非所有字段都与您的匹配):
from wagtail.contrib.modeladmin.options import ModelAdmin, modeladmin_register
class OrderAdmin(ModelAdmin):
model = Order
menu_order = -100
menu_label = 'Orders'
menu_icon = 'fa-shopping-cart'
list_display = ('number', 'customer', 'date_placed', 'total', 'payment_method', 'status')
list_filter = (OrderStatusFilter, )
search_fields = ('number', 'customer')
inspect_view_enabled = True
inspect_view_fields = ['number', 'status', 'customer', 'shipping_address', 'total', 'subtotal', 'shipping', 'handling', 'tax', 'date_placed', 'notes', 'payment_method', 'payment_card']
modeladmin_register(OrderAdmin)
以上内容可让您查看 Order
及其关联的 OrderItem
,而无需将 Order
声明为片段。 Reference
我已经定义了两个模型并将它们链接起来,如下所示。 Order
模型应使用 Wagtail InlinePanel 显示 OrderItems
。如果不将 Order
模型注册为片段,我如何才能 工作?
from wagtail.admin.edit_handlers import InlinePanel
from wagtail.core.models import Orderable
from wagtail.snippets.models import register_snippet
from modelcluster.fields import (
ParentalKey,
)
from modelcluster.models import ClusterableModel
@register_snippet
class Order(ClusterableModel):
panels = [
InlinePanel("items", label="Order items"),
]
def __str__(self):
return f"Order {self.id}"
def get_total_cost(self):
return sum(item.get_cost() for item in self.items.all())
class OrderItem(Orderable):
order = ParentalKey(
Order,
related_name="items",
on_delete=models.CASCADE,
blank=False,
)
product = models.CharField(max_length=255)
price = models.DecimalField(max_digits=10, decimal_places=2)
quantity = models.PositiveIntegerField(default=1)
panels = [
FieldPanel("product"),
FieldPanel("price"),
FieldPanel("quantity"),
]
在找到 models.py
的同一个应用程序中创建 wagtail_hooks.py
。然后,在 wagtail_hooks.py
中,做这样的事情(这里 OrderAdmin
class 中有很多额外内容供您查看 - 请注意,并非所有字段都与您的匹配):
from wagtail.contrib.modeladmin.options import ModelAdmin, modeladmin_register
class OrderAdmin(ModelAdmin):
model = Order
menu_order = -100
menu_label = 'Orders'
menu_icon = 'fa-shopping-cart'
list_display = ('number', 'customer', 'date_placed', 'total', 'payment_method', 'status')
list_filter = (OrderStatusFilter, )
search_fields = ('number', 'customer')
inspect_view_enabled = True
inspect_view_fields = ['number', 'status', 'customer', 'shipping_address', 'total', 'subtotal', 'shipping', 'handling', 'tax', 'date_placed', 'notes', 'payment_method', 'payment_card']
modeladmin_register(OrderAdmin)
以上内容可让您查看 Order
及其关联的 OrderItem
,而无需将 Order
声明为片段。 Reference