Как ограничить Django-CMS template_choices на основе родительской страницы - PullRequest
0 голосов
/ 14 сентября 2018

Этот вопрос, вероятно, можно решить с помощью более широкого вопроса: «Как заменить атрибут python 2.7 на свойство извне», но, возможно, есть способ выполнить это с помощью Django-CMS, поэтому я спрашиваю:

Я пытаюсь ограничить выбор шаблонов страниц Django-CMS (v3.4.x) на основе их родителей, поэтому для этого я подумал о том, чтобы переопределить его template_choices с помощью функции, но я вижу, что в Модель Django-CMS Page загружается при создании, например:

@python_2_unicode_compatible
class Page(...):
...
TEMPLATE_DEFAULT = get_cms_setting('TEMPLATES')[0][0]
template_choices = [(x, _(y)) for x, y in get_cms_setting('TEMPLATES')]
...

Изменение get_cms_settins не может быть и речи, но мне нужно изменить TEMPLATE_DEFAULT и template_choices, чтобы они имели правильные значения, которые я желаю. Поскольку я все еще плохо знаком с Django и Python, у меня вопрос , где и как как мне это сделать?

1 Ответ

0 голосов
/ 14 сентября 2018

Моей первой попыткой было сделать что-то подобное на моем models.py:

@property
def template_choices(self):
    from cms.utils import get_cms_setting
    templates = [(x, _(y)) for x, y in get_cms_setting('TEMPLATES')]
    if self.parent:
        if self.parent.template == 'parent_a.html':
            templates = [('child_A.html', _('Child A'))]
        elif self.parent.template == 'parent_b.html':
            templates = [('child_b.html', _('Child B'))]
        else:
            templates = [('fullwidth.html', _('Fullwidth'))]
    else:
        templates = [('home_page.html', _('Homepage')), 
                     ('parent_a.html', _('Parent A')), 
                     ('parent_b.html', _('Parent B'))]
    return templates


@property
def template_default(self):
    return self.template_choices[0][0]


Page.template_choices = template_choices
Page.TEMPLATE_DEFAULT = template_default

И это означает правильную настройку этих полей, если я пытаюсь проверить любой экземпляр Page, однако, когда я пытаюсь редактировать любую страницу и нажимаю на меню Страница> Шаблоны, все шаблоны работают Похоже, атрибуты template_choices и TEMPLATE_DEFAULT игнорируются. Проверка pagemodel.py, кажется, подтверждает это, поскольку методы get_template и get_template_name используют get_cms_setting('TEMPLATES') вместо этих полей. Также в cms_toolbars.py для # templates menu секции get_cms_setting('TEMPLATES'), а не self.page.template_choices, которая, кажется, является основным виновником. Итак, этот вопрос превратился в сообщение об ошибке: https://github.com/divio/django-cms/issues/6520

...