g-将queryset传递给内联

时间:2018-11-21 09:01:03

标签: django 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添加到Foreignkey字段中来做到这一点,但是AFAIK,这将是一个“静态”过滤器,因为它与模型有关,而与它的等价关系无关,因此对于每个新实例化的检查都是相同的...

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

另一个丑陋的解决方案是显式定义Course_1,Course_2等课程,但是这里的问题是,我每年都必须增加另一个课程,因为它们每年都会开设一门新课程! 因此,这给我留下了很多选择:以某种方式覆盖(但我很茫然)InlinePanel对象的行为,或者更改我设计站点的方式。 谁能帮我?非常感谢你!

1 个答案:

答案 0 :(得分:0)

一个实用的选择是使用“常规Django视图”构建应用程序的此特定部分,自由借用Wagtail可视化设计,以便最终用户看上去一切都一样。假设您正在构建一个非常严格的数据结构显示-course, exam,而不是“自由格式的内容”,那么我可能会选择这样做它。

(请注意,如果Wagtail不是驱动页面显示的一个,则Wagtail 模板标签可能会或可能无法正常工作。我建议您实施自己的产品,当然可以从Wagtail源码中自由复制-代码以获取灵感。)最后,用户不会感觉到差异,并且您可以非常自由地开发URL,这些URL会将用户发送到Wagtail管理的目标页面,例如课程说明和考试本身。

另一个实用的选择是使用Django模板标签来构建显示器的某些部分,这些部分原本由Wagtail管理,尽管这可能会更加复杂。由于 Django 位于整个主题之下,因此“ Django规则仍然适用。”