56 lines
1.7 KiB
Python
56 lines
1.7 KiB
Python
"""
|
||
公共抽象模型。所有业务页面应继承 SEOablePage 而非直接继承 wagtail.models.Page,
|
||
以统一获得 SEO 字段(详见 documents/设计方案分析与完善版.md §2.5)。
|
||
"""
|
||
from django.db import models
|
||
from wagtail.admin.panels import FieldPanel
|
||
from wagtail.fields import RichTextField
|
||
from wagtail.models import Page
|
||
|
||
|
||
class SEOablePage(Page):
|
||
seo_title_override = models.CharField(
|
||
max_length=70, blank=True, verbose_name="SEO 标题",
|
||
help_text="留空则使用页面标题",
|
||
)
|
||
seo_description_override = models.CharField(
|
||
max_length=160, blank=True, verbose_name="SEO 描述",
|
||
)
|
||
og_image = models.ForeignKey(
|
||
"wagtailimages.Image",
|
||
null=True,
|
||
blank=True,
|
||
on_delete=models.SET_NULL,
|
||
related_name="+",
|
||
verbose_name="社交分享图",
|
||
)
|
||
canonical_url = models.URLField(blank=True, verbose_name="Canonical URL")
|
||
schema_json = models.JSONField(blank=True, default=dict, verbose_name="结构化数据 (JSON-LD)")
|
||
|
||
promote_panels = Page.promote_panels + [
|
||
FieldPanel("seo_title_override"),
|
||
FieldPanel("seo_description_override"),
|
||
FieldPanel("og_image"),
|
||
FieldPanel("canonical_url"),
|
||
FieldPanel("schema_json"),
|
||
]
|
||
|
||
class Meta:
|
||
abstract = True
|
||
|
||
|
||
class SimpleContentPage(SEOablePage):
|
||
"""通用富文本内容页,用于隐私政策、服务条款等法务/说明类页面。"""
|
||
|
||
body = RichTextField(blank=True, verbose_name="正文内容")
|
||
|
||
content_panels = SEOablePage.content_panels + [
|
||
FieldPanel("body"),
|
||
]
|
||
|
||
parent_page_types = ["home.HomePage"]
|
||
subpage_types = []
|
||
|
||
class Meta:
|
||
verbose_name = "通用内容页"
|