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 следующим образом:
\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, это будет "статический" фильтр, потому что он будет связан с моделью, а не с ее значениями, поэтому он будет одинаковым для каждого нового экземпляра экзамена....
Первое - крайне неудовлетворительное решение - заменить InlinePanel на 2-3 FieldPanels (обычно экзамен не требует более 2-3 других подготовительных экзаменов)...
Другим уродливым решением было бы явное определение классов Course_1, Course_2 и т. Д., Но проблема здесь в том, что каждый год мне приходилось добавлять новый класс, потому что они каждый год устанавливали новый курс! Так что у меня не остается большого выбора: переопределить каким-либо образом (но я нахожусь в темноте) поведение объекта InlinePanel или изменить способ, которым я разработал сайт. Может кто-нибудь мне помочь? Огромное спасибо!
1 ответ
Одним из прагматичных вариантов может быть использование "обычных представлений Django" для создания этой конкретной части приложения, свободно заимствуя визуальный дизайн Wagtail, чтобы все оставалось одинаковым для конечного пользователя. Учитывая, что вы строите отображение очень жесткой структуры данных - course, exam
и т. д., в отличие от "контента в свободной форме", вероятно, я бы выбрал это.
(Обратите внимание, что теги шаблонов Wagtail могут работать или не работать должным образом, когда Wagtail не является движущей силой отображения страницы. Я бы рекомендовал реализовать свой собственный, конечно же, свободное копирование из исходного кода Wagtail для вдохновения.) В конце концов, пользователь не почувствует разницы, и вы сможете очень свободно разрабатывать URL-адреса, которые будут отправлять пользователя на целевую страницу, управляемую Wagtail, например, описания курсов и сами экзамены.
Другим прагматичным вариантом является использование шаблонных тегов Django для создания частей дисплея, которые в противном случае управляются Wagtail, хотя это может быть немного сложнее. Так как Django находится под всем этим,"правила Django все еще применяются".