4

我正在构建一个包含一个主站点和一些微型站点的设置。每个微型网站都将有一个单独的品牌,但使用相同的页面类型。

鉴于 Wagtail 已经有一个Site链接到适当Page树的对象,是否还有内置功能来配置模板加载器以选择合适的base.html,或者我是否必须编写自定义模板加载器?

4

2 回答 2

8

Wagtail 没有任何内置功能,因为它不对模板的组合方式做出任何假设。但是,您可以很容易地使用该wagtail.contrib.settings模块自己实现这一点,该模块提供了将自定义属性附加到各个站点的能力。例如,您可以使用base_template字段定义 TemplateSettings 模型 - 然后您的模板可以检查此设置并动态扩展适当的模板,使用类似:

{% load wagtailsettings_tags %}
{% get_settings %}
{% extends settings.my_app.TemplateSettings.base_template %}
于 2016-02-15T15:34:13.130 回答
6

我扩展了上述答案以提供对{% extends ... %}标签的覆盖以使用template_dir参数。

myapp.models:

from wagtail.contrib.settings.models import BaseSetting, register_setting

@register_setting
class SiteSettings(BaseSetting):
    """Site settings for each microsite."""

    # Database fields
    template_dir = models.CharField(max_length=255,
                                    help_text="Directory for base template.")

    # Configuration
    panels = ()

myapp.templatetags.local:

from django import template
from django.core.exceptions import ImproperlyConfigured
from django.template.loader_tags import ExtendsNode
from django.template.exceptions import TemplateSyntaxError


register = template.Library()


class SiteExtendsNode(ExtendsNode):
    """
    An extends node that takes a site.
    """

    def find_template(self, template_name, context):

        try:
            template_dir = \
                context['settings']['cms']['SiteSettings'].template_dir
        except KeyError:
            raise ImproperlyConfigured(
                "'settings' not in template context. "
                "Did you forget the context_processor?"
            )

        return super().find_template('%s/%s' % (template_dir, template_name),
                                     context)


@register.tag
def siteextends(parser, token):
    """
    Inherit a parent template using the appropriate site.
    """

    bits = token.split_contents()

    if len(bits) != 2:
        raise TemplateSyntaxError("'%s' takes one argument" % bits[0])

    parent_name = parser.compile_filter(bits[1])
    nodelist = parser.parse()

    if nodelist.get_nodes_by_type(ExtendsNode):
        raise TemplateSyntaxError(
            "'%s' cannot appear more than once in the same template" % bits[0])

    return SiteExtendsNode(nodelist, parent_name)

我的项目设置:

TEMPLATES = [
    {
        ...
        'OPTIONS': {
            ...
            'builtins': ['myapp.templatetags.local'],
        },
    },
]
于 2016-02-15T23:09:31.083 回答