Задание пользовательского порядка отношений M2M в FieldPanel для зарегистрированных простых моделей с фрагментами - PullRequest
1 голос
/ 24 апреля 2020

У нас есть приложение Django / DRF с классом продукта, который добавляется в трясогузку как фрагмент, поэтому редакторам не нужно использовать два интерфейса администрирования:

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 %}), так и список фрагментов в администраторе должны использовать Meta указанный порядок, но FieldPanel для related_products при просмотре / редактировании отдельного фрагмента продукта должен использовать другой порядок.

1 Ответ

1 голос
/ 30 апреля 2020

Вы можете переопределить порядок, показанный в редакторе, передав аргумент 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
...