几天来我一直面临一个问题,但是,无论我继续搜索多少,都无法在这里或网络上的任何地方找到任何解决方案。 因此,这里是:我正在为某种提供教学课程的机构开发网站。我正在使用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对象的行为,或者更改我设计站点的方式。 谁能帮我?非常感谢你!
答案 0 :(得分:0)
一个实用的选择是使用“常规Django视图”构建应用程序的此特定部分,自由借用Wagtail可视化设计,以便最终用户看上去一切都一样。假设您正在构建一个非常严格的数据结构显示-course, exam
,等,而不是“自由格式的内容”,那么我可能会选择这样做它。
(请注意,如果Wagtail不是驱动页面显示的一个,则Wagtail 模板标签可能会或可能无法正常工作。我建议您实施自己的产品,当然可以从Wagtail源码中自由复制-代码以获取灵感。)最后,用户不会感觉到差异,并且您可以非常自由地开发URL,这些URL会将用户发送到Wagtail管理的目标页面,例如课程说明和考试本身。
另一个实用的选择是使用Django模板标签来构建显示器的某些部分,这些部分原本由Wagtail管理,尽管这可能会更加复杂。由于 Django 位于整个主题之下,因此“ Django规则仍然适用。”