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

如何在Wagtail中用单个Master Page适配多个分类页面?

解决Wagtail中单个Master对应多个分类页面的问题

方案一:通过页面树关联(单Master下挂多分类页)

Wagtail允许一个父页面拥有多个子页面,你只需创建一个Master页面,将所有分类页面设为它的子页面即可,无需重复创建Master。

调整分类页面代码

在分类页面类中指定允许的父页面类型,确保能在Master下创建该类页面:

class ProductsIndexPage(Page):
    # 介绍文本
    intro = RichTextField(blank=True)
    # 允许该页面以Master作为父页面
    parent_page_types = ['your_app.Master']
    # 限制该页面不能有子页面(按需调整)
    subpage_types = []

    content_panels = Page.content_panels + [
        FieldPanel('intro', classname="full"),
        MultiFieldPanel([
            InlinePanel('products_sell', label="产品")],
            heading="产品列表",),
        MultiFieldPanel([
            InlinePanel('training', label="培训项目")],
            heading="培训列表", ),
    ]

在模板中调用Master内容

所有分类页面可通过父页面获取Master的内容:

{# 分类页面模板 #}
{% with master_page=self.get_parent %}
    <h2>{{ master_page.name }}</h2>
    {{ master_page.contacts|richtext }}
    {% if master_page.image %}
        <img src="{{ master_page.image.url }}" alt="{{ master_page.image.alt_text }}">
    {% endif %}
{% endwith %}

方案二:全局共享Master内容(非页面树关联)

如果分类页面不需要和Master在页面树中关联,而是要全局复用同一套配置,推荐使用Wagtail的站点设置功能,替代Page类型的Master:

1. 创建全局站点设置模型

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

@register_setting
class MasterSettings(BaseSiteSetting):
    # 名称
    name = models.CharField(max_length=200)
    # 联系信息
    contacts = RichTextField(blank=True, null=True)
    # 图片
    image = models.ForeignKey(
        'wagtailimages.Image',
        blank=True,
        null=True,
        on_delete=models.SET_NULL,
        related_name='+',
        verbose_name='图片'
    )

    panels = [
        FieldPanel('name'),
        FieldPanel('contacts'),
        FieldPanel('image'),
    ]

2. 在模板中调用全局配置

在任意分类页面模板中直接引用全局设置:

{% load wagtailsettings_tags %}
{% get_settings %}

<h2>{{ settings.your_app.MasterSettings.name }}</h2>
{{ settings.your_app.MasterSettings.contacts|richtext }}
{% if settings.your_app.MasterSettings.image %}
    <img src="{{ settings.your_app.MasterSettings.image.url }}" alt="{{ settings.your_app.MasterSettings.image.alt_text }}">
{% endif %}

3. 管理面板编辑

在Wagtail后台的「设置」菜单中找到MasterSettings,即可统一编辑全局配置,所有分类页面会自动同步这些内容。

方案三:保留Page类型Master(非子页面关联)

如果一定要保留Master为Page类型,且分类页面不是它的子页面,可通过代码直接获取Master实例:

class ProductsIndexPage(Page):
    # ... 原有字段和面板 ...

    def get_master_page(self):
        # 获取唯一的Master页面(确保后台只创建一个)
        return Master.objects.first()

模板中调用:

{% with master_page=self.get_master_page %}
    {% if master_page %}
        <h2>{{ master_page.name }}</h2>
        {{ master_page.contacts|richtext }}
    {% endif %}
{% endwith %}

翻译后的原始代码

from wagtail.models import Page, ParentalKey
from wagtail.fields import RichTextField
from wagtail.admin.panels import FieldPanel, MultiFieldPanel, InlinePanel
from django.db import models

class Master(Page):
    # 名称
    name = models.CharField(max_length=200)
    # 联系信息
    contacts = RichTextField(
        blank=True,
        null=True,
    )
    # 图片
    image = models.ForeignKey('wagtailimages.Image',
                              blank=True,
                              null=True,
                              on_delete=models.SET_NULL,
                              related_name='+',
                              verbose_name='图片')

    content_panels = Page.content_panels + [
        FieldPanel('name'),
        FieldPanel('contacts'),
        FieldPanel('image'),
    ]

class ProductsIndexPage(Page):
    # 介绍文本
    intro = RichTextField(blank=True)
    content_panels = Page.content_panels + [
        FieldPanel('intro', classname="full"),
        MultiFieldPanel([
            InlinePanel('products_sell', label="产品")],
            heading="产品列表",),
        MultiFieldPanel([
            InlinePanel('training', label="培训项目")],
            heading="培训列表", ),
    ]

class Training(AbstractProducts):
    # 关联到产品索引页
    product = ParentalKey(
        'ProductsIndexPage',
        on_delete=models.CASCADE,
        related_name='training'  # 反向关联名称,用于在产品页中获取培训项目
    )

内容的提问来源于stack exchange,提问作者Mr. ksen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 01:45:34