如何在Wagtail CMS多站点中为每个站点分别提供静态和模板

时间:2019-05-13 13:56:26

标签: django wagtail multisite

我正在尝试使用随附的Django Sites框架创建多站点 Wagtail 项目。我在Wagtail文档中找不到如何分别为每个站点提供模板和静态信息。有人可以帮助我提供建议或指向某些教程的链接吗? 谢谢。

2 个答案:

答案 0 :(得分:0)

在Wagtail中,视图逻辑存在于页面模型中。发出请求时,Wagtail URL解析器将调用页面serve方法。 g代码形式wagtail.core.models.Page看起来像这样:

def get_template(self, request, *args, **kwargs):
    if request.is_ajax():
        return self.ajax_template or self.template
    else:
        return self.template

def serve(self, request, *args, **kwargs):
    request.is_preview = getattr(request, 'is_preview', False)

    return TemplateResponse(
        request,
        self.get_template(request, *args, **kwargs),
        self.get_context(request, *args, **kwargs)
    )

要回答您的问题:您必须重写get_template并添加一些逻辑以使模板名称在每个站点中唯一。这是未经测试的代码,但是您可以理解:

class SomePage(Page):
    ...
    def get_template(self, request, *args, **kwargs):
        return request.site + super().get_template(request, *args, **kwargs)

现在,模板名称以站点为前缀。因此,您只需要提供名称正确的模板即可。

答案 1 :(得分:0)

在Wagtail 2.10中,此方法不再有效,request.site已弃用

相反,您可以这样做:

class SomePage(Page):
...
def get_template(self, request, *args, **kwargs):
    return Site.find_for_request(request).site_name + '/' + super().get_template(request, *args, **kwargs)

如果需要引用ajax模板,也可以使用这种方法:

class SomePage(Page):
...

ajax_template = 'ajax_foo.html'
template = 'foo.html'

def get_template(self, request, *args, **kwargs):
    template = Site.find_for_request(request).site_name + '/' + self.template
    if request.is_ajax():
        template = Site.find_for_request(request).site_name + '/' + self.ajax_template
    return template