首页 > 解决方案 > Wagtail - 将查询集传递给内联

问题描述

几天以来我都面临着一个问题,但是,无论我继续搜索多少,我都无法在这里或网络上的任何地方找到任何解决方案。所以这里是:我正在为某种提供教学课程的机构开发一个网站。我正在使用 WAGTAIL 并以这种方式构建类:

class Course(Page):
...
    content_panels = Page.content_panels

class Exam(Page):
    #fields

    content_panels = Page.content_panels + [
        #fields
        InlinePanel('preparatory_exam', heading='Preparatory Exams'),
    ]

class PreparatoryExam(Orderable):
    page = ParentalKey('Exam',
        on_delete=models.CASCADE,
        related_name = 'preparatory_exams',
        )
    name = models.ForeignKey(
        Exam,
        on_delete=models.CASCADE,
        blank=True,
        null=True,
        related_name = 'preparatory_exam',
    )

我还以这种方式构建了 ADMIN 部分 PAGES:

\COURSE_1_PAGE
\-----------\EXAM_1
\-----------\EXAM_2
\------------------\Prep exam 1
\------------------\Prep exam 2
\-----------\EXAM_3
...
\COURSE_2_PAGE
\-----------\EXAM_1
\-----------\EXAM_2
\-----------\EXAM_3
....

所以,问题是:在为某个考试选择预备考试时,有没有办法将自定义查询集传递给内联下拉框?我想要的是将集合限制为同一课程中的考试。我可以通过在外键字段中添加 limit_choices_to 来做到这一点,但是 AFAIK,这将是一个“静态”过滤器,因为它与模型相关而不是它的 istances,所以对于每个新实例化的考试都是一样的...

一个第一个非常不令人满意的解决方案是用 2-3 个 FieldPanel 更改 InlinePanel(通常考试不需要超过 2-3 个其他准备考试)......

另一个 UGLY 解决方案是明确定义 Course_1、Course_2 等课程,但这里的问题是每年我都必须添加另一个课程,因为他们每年都会开设一门新课程!所以它给我留下的选择不多:以某种方式(但我在黑暗中)覆盖 InlinePanel 对象行为,或者改变我设计网站的方式。谁能帮我?非常非常感谢你!

标签: djangowagtail

解决方案


一个实用的选择可能是使用“普通的 Django 视图”来构建应用程序的这个特定部分,自由地借用 Wagtail 视觉设计,以便最终用户看起来一切都一样。鉴于您正在构建一个非常严格的数据结构的显示 -course, exam等等,而不是“自由形式的内容”,这可能是我会选择这样做的方式

(请注意,当 Wagtail 不是驱动页面显示的那个时,Wagtail模板标签可能会或可能不会正常工作。我建议您自己实现,当然可以从 Wagtail 源代码中自由复制以获得灵感。)最后,用户不会察觉到差异,您可以非常自由地开发将用户发送到 Wagtail 管理的目标页面的 URL,例如课程描述和考试本身。

另一个实用的选择是使用 Django 模板标签来构建由 Wagtail 管理的显示部分,尽管这可能会更复杂一些。由于Django在整个事物之下,“Django 规则仍然适用。”


推荐阅读