首页 > 解决方案 > Wagtail 内联面板 - 排序顺序

问题描述

因此,我正在努力在我的网站上的 InlinePanel (对于可订购的)中订购选择。在管理页面中,添加新项目时,选项按添加到站点的顺序显示(因此,本质上是该项目的“id”);考虑到有数百个选项以非用户友好的方式呈现,这并不理想。

我假设这需要定义为 orderable 中的 ordering meta,但我似乎无法让它工作。这就是我的可订购商品的样子:

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'

并且,尝试在我想要排序的“人”中附加字段,“姓名”:

class Meta:
    ordering = 'person.name'

必须有一种明显的方法来解决我正在寻找的这个问题。从内容创建者的角度来看,“id”的默认排序顺序(在本例中为“person.People”)很少适合。

任何建议将不胜感激!

提前致谢,

标签: djangowagtail

解决方案


人物模型应该有:

    ordering = ['name']

代替

    ordering = 'name'

并且您的 Orderable 对象应该将其元更改为

    class Meta(Orderable.Meta):

通过 Django Docs,这是抽象基类和排序的示例:

元和多表继承¶

在多表继承的情况下,子类继承父类的 Meta 类是没有意义的。所有 Meta 选项都已应用于父类,再次应用它们通常只会导致矛盾的行为(这与抽象基类的情况相反,其中基类本身并不存在)。

因此子模型无权访问其父级的 Meta 类。但是,在少数情况下,子级从父级继承行为:如果子级没有指定 ordering 属性或 get_latest_by 属性,它将从其父级继承这些。

如果父级有排序并且您不希望子级有任何自然排序,则可以显式禁用它:

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

创建抽象基类时,Django 使您在基类中声明的任何 Meta 内部类都可用作属性。如果子类没有声明自己的 Meta 类,它会继承父类的 Meta。如果孩子想要扩展父母的 Meta 类,它可以继承它。例如:从 django.db 导入模型

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

class Student(CommonInfo):
    # ...
    class Meta(CommonInfo.Meta):
        db_table = 'student_info'

推荐阅读