首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为Wagtail CMS多站点中的每个站点分别提供静态和模板服务

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

Stack Overflow用户
提问于 2019-05-13 13:56:25
回答 3查看 480关注 0票数 2

我正在尝试使用包含的Django站点框架创建多站点 Wagtail项目。我无法在Wagtail文档中找到如何单独为每个站点提供模板和静态服务。有人能帮我提供建议或链接到某个教程吗?谢谢。

EN

回答 3

Stack Overflow用户

发布于 2019-05-19 15:49:51

在Wagtail中,视图逻辑存在于页面模型上。当请求发出时,Wagtail url解析器将调用页面serve方法。Wagtail代码表单wagtail.core.models.Page如下所示:

代码语言:javascript
复制
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并添加一些逻辑使模板名称在每个站点上都是唯一的。这是未经测试的代码,但您有这样的想法:

代码语言:javascript
复制
class SomePage(Page):
    ...
    def get_template(self, request, *args, **kwargs):
        return request.site + super().get_template(request, *args, **kwargs)

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

票数 1
EN

Stack Overflow用户

发布于 2020-09-02 10:13:31

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

相反,你可以这样做:

代码语言:javascript
复制
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模板,也可以使用以下方法:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2022-09-11 18:08:31

在allcaps回答的基础上,我创建了一个简单的代理模型,所有的Page模型都是从它继承的。考虑一个名为BlogPage的页面

代码语言:javascript
复制
class SitePage(Page):
    def get_template(self, request):
        template_name = super().get_template(request)
        domain = request.get_host()

        if settings.DEBUG:
            if not domain.startswith('localhost'):
                domain = domain.split('.localhost')[0]

        return [
            domain + '/' + template_name,
            template_name,
        ]

    class Meta(Page.Meta):
        abstract = True


class BlogPage(SitePage):
    ...

现在,我可以拥有一个类似于以下内容的templates/文件夹:

代码语言:javascript
复制
templates/
    domain1.com/
        blog_page.html
    domain2.com/
        blog_page.html
    domain3.com/
        blog_page.html

如果您为每个域配置了一个Wagtail Site,这将根据域名应用正确的模板。

还有几个额外的特性:

  • 在调试模式中,去掉localhost,这样您就可以转到domain1.com.localhost:8000,它将找到domain1.com的模板。
  • 返回一个模板列表依次尝试每个模板,因此您也可以拥有一个默认模板,如果找不到特定的模板,任何网站都可以使用该模板。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56113922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档