You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Wagtail Multi-instance为不同客户配置独立模板?

在Wagtail多实例架构下为不同客户站点配置独立模板的解决方案

方案1:基于站点标识动态切换模板

直接在页面模型中重写get_template方法,根据当前访问的站点域名/ID返回对应模板,实现不同客户站点加载专属模板,同时共享核心功能代码。

实现步骤:

  1. 在项目templates目录下按客户分类存放模板:

    templates/
    └── blog/
        ├── post_page.html       # 默认模板
        ├── client1/
        │   └── post_page.html   # 客户1的模板
        └── client2/
            └── post_page.html   # 客户2的模板
    
  2. 修改PostPage模型,重写get_template方法:

    from django.template.loader import get_template, TemplateDoesNotExist
    from wagtail.models import Site, Page
    
    class PostPage(Page):
        # ... 你的页面字段定义 ...
    
        def get_template(self, request, *args, **kwargs):
            # 获取当前请求对应的站点
            site = Site.find_for_request(request)
            
            # 根据站点域名匹配对应模板
            template_map = {
                "client1.example.com": "blog/client1/post_page.html",
                "client2.example.com": "blog/client2/post_page.html",
            }
            
            target_template = template_map.get(site.domain)
            if target_template:
                # 验证模板是否存在,避免抛出不存在错误
                try:
                    get_template(target_template)
                    return target_template
                except TemplateDoesNotExist:
                    pass
            
            # 模板不存在时 fallback到默认模板
            return "blog/post_page.html"
    

方案2:通过站点自定义配置实现灵活模板切换

如果需要无需修改代码即可新增客户模板的灵活性,可以给Wagtail站点添加自定义配置字段,存储模板前缀。

实现步骤:

  1. 定义站点扩展设置:

    from django.db import models
    from wagtail.contrib.settings.models import BaseSiteSetting, register_setting
    
    @register_setting
    class SiteTemplateConfig(BaseSiteSetting):
        template_prefix = models.CharField(
            max_length=50,
            default="default",
            help_text="输入模板前缀(如client1),对应templates/blog/{prefix}/下的模板文件"
        )
    
  2. 修改PostPage模型的get_template方法:

    from django.template.loader import get_template, TemplateDoesNotExist
    from wagtail.models import Site, Page
    
    class PostPage(Page):
        # ... 你的页面字段定义 ...
    
        def get_template(self, request, *args, **kwargs):
            site = Site.find_for_request(request)
            # 获取当前站点的自定义模板配置
            template_config = SiteTemplateConfig.for_site(site)
            target_template = f"blog/{template_config.template_prefix}/post_page.html"
            
            # 验证模板存在性
            try:
                get_template(target_template)
                return target_template
            except TemplateDoesNotExist:
                return "blog/post_page.html"
    
  3. 后台配置:
    进入设置 -> 站点 -> 编辑对应站点,找到新增的「Site Template Config」字段,输入客户对应的模板前缀(如client1),保存后站点即可加载对应模板。


方案3:模板继承复用基础逻辑

如果不同客户的模板仅部分区块样式不同,可通过模板继承最大化复用核心逻辑,减少代码冗余。

实现步骤:

  1. 创建基础模板templates/blog/base_post_page.html:

    {% extends "base.html" %}
    
    {% block page_header %}
        <h1 class="page-title">{{ page.title }}</h1>
    {% endblock %}
    
    {% block content %}
        <!-- 所有站点共享的内容逻辑 -->
        <div class="post-meta">发布于 {{ page.date }}</div>
        <!-- 留给客户模板覆盖的自定义区块 -->
        {% block custom_post_content %}{% endblock %}
    {% endblock %}
    
  2. 客户1的模板templates/blog/client1/post_page.html:

    {% extends "blog/base_post_page.html" %}
    
    {% block custom_post_content %}
        <!-- 客户1的Bootstrap主题样式 -->
        <div class="card client1-post-card">
            {{ page.body|richtext }}
        </div>
    {% endblock %}
    
  3. 客户2的模板templates/blog/client2/post_page.html:

    {% extends "blog/base_post_page.html" %}
    
    {% block custom_post_content %}
        <!-- 客户2的Bootstrap主题样式 -->
        <div class="alert alert-secondary client2-post-content">
            {{ page.body|richtext }}
        </div>
    {% endblock %}
    
  4. 结合方案1或方案2的get_template方法切换模板即可。


内容的提问来源于stack exchange,提问作者shaebi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 05:10:50