Wagtail - передача набора запросов во встроенный - PullRequest
0 голосов
/ 21 ноября 2018

Я сталкиваюсь с проблемой изо дня в день, но, независимо от того, сколько я продолжаю искать, я не мог найти никакого решения здесь или где-либо в Интернете.Итак, вот оно: я разрабатываю веб-сайт для какого-то учреждения, которое предлагает учебные курсы.Я использую 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',
    )

Я также структурировал раздел PAGES раздела 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 Ответ

0 голосов
/ 22 ноября 2018

Одним из прагматичных вариантов может быть использование «обычных представлений Django» для создания этой конкретной части приложения, свободно заимствуя визуальный дизайн Wagtail, чтобы все по-прежнему выглядело одинаково для конечного пользователя.Учитывая, что вы строите отображение очень жесткой структуры данных - course, exam, и т. Д. , в отличие от «контента в произвольной форме», вероятно, я бы выбрал это.

(Обратите внимание, что теги шаблонов Wagtail могут работать или не работать должным образом, когда Wagtail не тот, кто управляет отображением страницы. Я бы порекомендовал реализовать собственное, конечно же, свободное копирование из Wagtail.исходный код для вдохновения.) В конце концов, пользователь не почувствует разницы, и вы можете очень свободно разрабатывать URL-адреса, которые будут отправлять пользователя на целевую страницу, управляемую Wagtail, например, описания курса и сами экзамены.

Другим прагматичным вариантом является использование шаблонных тегов Django для создания частей дисплея, которые в противном случае управляются Wagtail, хотя это может быть немного сложнее.Поскольку Django находится под всем этим, «правила Django по-прежнему применяются».

...