Wagtail Inline Panel - Порядок сортировки - PullRequest
0 голосов
/ 24 февраля 2020

Так что я борюсь с заказом вариантов в InlinePanel (для заказа) на моем сайте. На странице администратора при добавлении нового элемента параметры представляются в том порядке, в котором они были добавлены на сайт (таким образом, по сути, это «идентификатор» для этого элемента); это менее чем идеально, учитывая, что сотни опций представлены способом, который не удобен для пользователя.

Я предполагаю, что это должно быть определено как упорядочение мета в пределах заказа, но я не могу заставить его работать. Вот как выглядит мой заказ:

class RelatedPeople(Orderable):
    service = ParentalKey('service.Services', related_name='related_person')
    person = models.ForeignKey('person.People', null=True, on_delete=models.SET_NULL, related_name='related_service')

panels = [
    FieldPanel('person')
]

Я попробовал следующее безуспешно:

class Meta:
    ordering = 'person'

и пытаюсь добавить поле в поле «персона», которое я хочу для сортировки по 'name':

class Meta:
    ordering = 'person.name'

Должен быть очевидный способ решить эту проблему, который я просматриваю. Порядок сортировки по умолчанию для id (в данном случае для person.People) редко бывает подходящим с точки зрения создателя контента.

Любой совет будет принят с благодарностью!

Заранее спасибо,

Роб

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

Модель персонажа должна иметь:

    ordering = ['name']

вместо

    ordering = 'name'

И метаданные вашего объекта Orderable должны иметь значение

    class Meta(Orderable.Meta):

Через Django Docs, это пример абстрактных базовых классов и порядок:

Мета-наследование и наследование нескольких таблиц¶

В ситуации с наследованием нескольких таблиц это не делает смысл для дочернего класса наследовать от мета-класса его родителя. Все опции Meta уже применены к родительскому классу, и их повторное применение обычно приводит только к противоречивому поведению (это отличается от случая абстрактного базового класса, где базовый класс не существует сам по себе).

Таким образом, дочерняя модель не имеет доступа к мета-классу своего родителя. Однако есть несколько ограниченных случаев, когда дочерний объект наследует поведение от родителя: если дочерний элемент не указывает атрибут упорядочения или атрибут get_latest_by, он наследует их от своего родителя.

Если родитель имеет упорядочение, и вы не хотите, чтобы дочерний элемент имел естественное упорядочение, вы можете явно отключить его:

   class ChildModel(ParentModel):
    # ...
    class Meta:
        # Remove parent's ordering effect
        ordering = []

Когда создается абстрактный базовый класс, Django создает любой внутренний класс Meta, который вы объявили в Базовый класс доступен в качестве атрибута. Если дочерний класс не объявляет свой собственный мета-класс, он наследует мета-класс родителя. Если ребенок хочет расширить Мета-класс родителя, он может сделать его подклассом. Например: django .db импортировать модели

class CommonInfo(models.Model):
    # ...
    class Meta:
        abstract = True
        ordering = ['name']

class Student(CommonInfo):
    # ...
    class Meta(CommonInfo.Meta):
        db_table = 'student_info'
0 голосов
/ 24 февраля 2020

Я не знаком с Wagtail, но вы можете взглянуть на эту проблему:

https://github.com/wagtail/wagtail/issues/4477#issuecomment -382277375

Обновление :

Может быть, вам просто нужно обновить модель Person следующим образом:

class Person(models.Model):
    ...

    class Meta:
        ordering = 'name'

В своих файлах вы пытаетесь упорядочить RelatedPeople по Person, но что вам нужно заказать список Person по name в выпадающем списке трясогузки

...