我们有一个DjangoDRF应用,其中有一个产品类,作为一个代码段添加到wagtail中,这样编辑就不需要使用两个管理界面。
from django.db import models
from modelcluster.models import ClusterableModel
from wagtail.admin.edit_handlers import FieldPanel, ...
@register_snippet
class Product(ClusterableModel):
...
related_products = models.ManyToManyField(
'self',
related_name='related_product',
blank=True,
symmetrical=False
)
class Meta:
ordering = ['-id']
为了在管理界面中选择相关的产品,需要使用 related_products
字段使用 FieldPanel
:
@register_snippet
class Product(ClusterableModel):
...
panels = [
...
FieldPanel('related_products'),
...
]
...
然而,似乎没有办法纯粹为管理目的而指定物品的定制订单,例如,通过添加一个 "自定义订单"。ordering
至 FieldPanel
. 文档中提到,代码段的排序方式不尽相同。Page
是的,但我并不希望在这种情况下允许编辑器控制排序,只是在FieldPanel最终在管理页面生成的多选择框内预定义的自定义排序。
我也找不到任何可能在这里有用的钩子,所以:是否有可能使用一个自定义的顺序 只是 的面板?
既是模板代码({% for product in products %}
),并且在管理员中的snippet列表应使用 Meta
-指定的顺序,但用于以下方面的 FieldPanel related_products
当查看编辑一个单独的产品snippet时,应该使用不同的排序。
你可以在编辑器中通过传递一个 queryset
争论,以 ModelMultipleChoiceField
在编辑表单中使用。通常,表单字段对象由内部的 FieldPanel
但您可以通过以下方式访问它们 覆盖生成的表格. 在这种情况下,可以这样做:
from django import forms
from wagtail.admin.forms import WagtailAdminModelForm
@register_snippet
class Product(ClusterableModel):
# ... include field / panel definitions as normal
class ProductForm(WagtailAdminModelForm):
related_products = forms.ModelMultipleChoiceField(
queryset=Product.objects.order_by('some_field'),
widget=forms.CheckboxSelectMultiple, # omit this for a multiselect box instead of checkboxes
required=False
)
Product.base_form_class = ProductForm