在FieldPanel中为snippet注册的普通模型指定M2M关系的自定义排序。

问题描述 投票:0回答:1

我们有一个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'),
        ...
    ]
    ...

然而,似乎没有办法纯粹为管理目的而指定物品的定制订单,例如,通过添加一个 "自定义订单"。orderingFieldPanel. 文档中提到,代码段的排序方式不尽相同。Page 是的,但我并不希望在这种情况下允许编辑器控制排序,只是在FieldPanel最终在管理页面生成的多选择框内预定义的自定义排序。

我也找不到任何可能在这里有用的钩子,所以:是否有可能使用一个自定义的顺序 只是 的面板?

既是模板代码({% for product in products %}),并且在管理员中的snippet列表应使用 Meta-指定的顺序,但用于以下方面的 FieldPanel related_products 当查看编辑一个单独的产品snippet时,应该使用不同的排序。

wagtail
1个回答
1
投票

你可以在编辑器中通过传递一个 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
© www.soinside.com 2019 - 2024. All rights reserved.