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 来做到这一点,但是 AFAIK,这将是一个“静态”过滤器,因为它与模型相关而不是它的 istances,所以对于每个新实例化的考试都是一样的...
一个第一个非常不令人满意的解决方案是用 2-3 个 FieldPanel 更改 InlinePanel(通常考试不需要超过 2-3 个其他准备考试)......
另一个 UGLY 解决方案是明确定义 Course_1、Course_2 等课程,但这里的问题是每年我都必须添加另一个课程,因为他们每年都会开设一门新课程!所以它给我留下的选择不多:以某种方式(但我在黑暗中)覆盖 InlinePanel 对象行为,或者改变我设计网站的方式。谁能帮我?非常非常感谢你!
解决方案
一个实用的选择可能是使用“普通的 Django 视图”来构建应用程序的这个特定部分,自由地借用 Wagtail 视觉设计,以便最终用户看起来一切都一样。鉴于您正在构建一个非常严格的数据结构的显示 -course, exam
等等,而不是“自由形式的内容”,这可能是我会选择这样做的方式。
(请注意,当 Wagtail 不是驱动页面显示的那个时,Wagtail模板标签可能会或可能不会正常工作。我建议您自己实现,当然可以从 Wagtail 源代码中自由复制以获得灵感。)最后,用户不会察觉到差异,您可以非常自由地开发将用户发送到 Wagtail 管理的目标页面的 URL,例如课程描述和考试本身。
另一个实用的选择是使用 Django 模板标签来构建由 Wagtail 管理的显示部分,尽管这可能会更复杂一些。由于Django在整个事物之下,“Django 规则仍然适用。”
推荐阅读
- scala - 使用 Akka Streams 设置正常关闭的更好方法
- javascript - 我们如何计算以英里和英尺为单位的多个纬度和经度的坐标?
- coveralls - 工作服:PR 中的覆盖差异和警报
- git - 将最新的 repo 更改拉到您的分支
- javascript - Netsuite - REST API (restlet) - 创建记录导致 INVALID_LOGIN_ATTEMPT 在第二次和更多记录请求失败
- python - python flask:创建一个具有可重复形式的窗口
- corda - Corda 状态变化和事件
- flutter - 如何在设备方向中出现错误?
- c++ - 使用 g++ 编译器的架构 arm64 的未定义符号
- java - Gradle 升级问题:java.lang.IllegalArgumentException:版本不能为空或为空