Wagtail 配置 SEO 信息
• 最后修改:2025-09-17 • 阅读量:25
Wagtail 安装后,提供一些 SEO 数据,包括“缩略名”、“标题标签”、“元描述”,但是还缺少“关键词”。
Wagtail 不包含关键词是因为国外的搜索引擎已经不使用该数据,只有国内的搜索引擎,如:百度,还在使用该数据。因此我们需要为 Wagtail 添加关键词字段。
创建一个 SEOMixin 抽象类,在该抽象类中定义“关键词”字段,所有的 Page 都继承该 SEOMixin,这样就能为每个页面添加“关键词”数据。
SEOMixin 抽象类在 basic/models.py文件中定义。
导入需要的类或函数
from django.utils.html import strip_tags
from django.utils.safestring import mark_safe
from wagtail.models import Page
from wagtail.admin.panels import MultiFieldPanel, FieldPanel
定义 SEOMixin 抽象类
定义 SEOMixin 抽象类继承 Page 类。
class SEOMixin(Page):
"""
定义 Page 使用的 SEO 数据字段。
"""
class Meta:
abstract = True
说明:使用 abstract = True 属性定义类为抽象类,不能被实例化。
添加关键词字段
关键词一般不超过 200 个字符,为了好编辑我们使用多行显示的 Django TextField 字段定义关键词字段:
meta_keywords = models.TextField(
verbose_name="元关键词",
blank=True,
help_text="在搜索引擎中使用的关键词信息",
)
代码解释说明:
verbose_name:在管理界面添加信息时,显示的字段名称blank:在数据库中是否允许该字段为空help_text:在管理界面添加信息时,字段名称下面的说明信息
定义 body_preview 属性
body_preview 属性的作用是提供一个 200 字符以内的简短版的 body 数据。
@property
def body_preview(self):
"""
简短版的 body 数据.
"""
# 为标签添加空格
body = str(self.body).replace(">", "> ")
# 去除标签
body = strip_tags(body)
# 获取简短版的数据
preview = body[:200] + "..." if len(body) > 200 else body
return mark_safe(preview)
代码解释说明:
- 在代码中已经做了注释
mark_safe的作用是把 html 数据处理成可安全使用的字符串数据。
定义 seo_description 属性
使用该属性的值作为页面的元描述数据:
@property
def seo_description(self) -> str:
"""
返回 seo 中使用的 元描述
"""
if self.search_description:
return self.search_description
if self.body_preview:
return self.body_preview
return ""
代码解释说明:
@property是一个装饰器,它的作用是把函数修饰成一个属性- 如果在添加 Page 时提供了“元描述”信息,使用用户提供的元描述信息,Wagtail 提供元描述字段的名称为
search_description - 如果没有输入“元描述”信息,则使用简短版的 body 数据
- 如果没有简短版的 body 数据,则返回空
定义 seo_keywords 属性
使用该属性的值作为页面的元关键词数据:
@property
def seo_keywords(self) -> str:
"""
返回在搜索引擎中使用的关键词信息.
"""
if self.meta_keywords:
return self.meta_keywords
return self.seo_description
代码解释说明:
@property是一个装饰器,它的作用是把函数修饰成一个属性- 如果在添加 Page 时提供了“元关键词”信息,使用用户提供的元关键词信息
- 如果没有输入“元关键词”信息,则使用
seo_description数据
在管理界面面板中显示字段
在如上的代码中,我们只定义了一个需要输入内容的字段 meta_keywords,需要把它添加到管理界面的面板中,使用户可输入数据:
promote_panels = [
MultiFieldPanel(
[
FieldPanel("slug"),
FieldPanel("seo_title"),
FieldPanel("search_description"),
FieldPanel("meta_keywords"),
],
_("For search engines"),
),
MultiFieldPanel(
[
FieldPanel("show_in_menus"),
],
_("For site menus"),
),
]
在如上代码中 FieldPanel("meta_keywords") 是我们自定义添加,其他的内容都是 Page 包含的 SEO 字段。