我正面临着几天来的一个问题,但是,无论我如何不断地搜索,我都无法在这里或网络上的任何地方找到任何解决方案。是这样的:我正在为一些提供教学课程的机构开发一个网站。我使用的是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',
)我还这样组织了管理部分的页面:
\COURSE_1_PAGE
\-----------\EXAM_1
\-----------\EXAM_2
\------------------\Prep exam 1
\------------------\Prep exam 2
\-----------\EXAM_3
...
\COURSE_2_PAGE
\-----------\EXAM_1
\-----------\EXAM_2
\-----------\EXAM_3
....因此,问题是:在为某个考试选择预备考试时,有没有办法将自定义查询集传递到内联下拉框?我想要的是将集合限制为同一课程中出现的考试。我可以通过在foreignkey字段中添加一个limit_choices_to来做到这一点,但是AFAIK,它将是一个“静态”过滤器,因为它将与模型相关,而不是与其实例相关,所以它对于每个新实例化的检查都是相同的……
第一个非常不令人满意的解决方案是用2-3个FieldPanels更改InlinePanel (通常一个考试不需要超过2-3个其他准备考试)……
另一个丑陋的解决方案是显式地定义Course_1、Course_2等类,但这里的问题是,我每年都必须添加另一个类,因为他们每年都会设置一门新课程!所以我没有太多的选择:以某种方式重写(但我一无所知) InlinePanel对象行为,或者改变我设计站点的方式。有谁可以帮我?非常非常感谢!
发布于 2018-11-23 00:15:23
一种实用的选择可能是使用“普通Django视图”来构建应用程序的这一特定部分,自由地借用Wagtail可视化设计,这样对于最终用户来说,一切看起来都是一样的。假设您正在构建一个非常严格的数据结构- course, exam等的显示,而不是“自由形式的内容”,这可能是我选择的方式。
(请注意,当Wagtail不是驱动页面显示的那个标记时,Wagtail模板标记可能会也可能不会正常工作。我建议实现您自己的代码,当然可以从Wagtail源代码中自由复制以获得灵感。)最后,用户不会察觉到差异,您可以非常自由地开发URL,将用户发送到Wagtail管理的目标页面,例如课程描述和考试本身。
另一个实用的选择是使用Django模板标记来构造显示的部分,否则由Wagtail管理,尽管这可能会变得有点复杂。因为Django是整个事情的基础,所以"Django规则仍然适用“。
https://stackoverflow.com/questions/53408434
复制相似问题