概述

TagPageConfig模型用于管理系统前台标签页面(Tag Detail)的展示与内容生成策略。通过该模型,可以控制页面标题的多样性、简介内容的个性化展示,以及当标签下无直接关联文章时的“补空”策略(分词查找相关文章、随机或近期文章填充)。

字段说明

1. 标题多样性配置

  • 标题多样性开关 (titlediversityenabled)
    • 类型: 布尔值
    • 默认值: False
    • 作用: 总开关。开启后,标签页的 <title>将由系统根据下方模板自动生成多样性标题,而非固定的“{标签名}相关内容介绍”格式。
  • 标题多样性模板 (titletemplates)
    • 类型: 多行文本
    • 默认值: 预置了11条标题模板
    • 作用: 提供标题生成的基础模板池。每行一个模板,支持 {标签名称}占位符,系统将随机选取并用实际标签名替换。
  • 拼接模板配置 (titleconnectortemplates)
    • 类型: 多行文本
    • 默认值: 预置了多种拼接样式
    • 作用: 定义如何将两个基础标题模板拼接成一个最终标题。每行一个模板,支持 {标题1}{标题2}占位符。系统随机选取一个拼接模板进行组合。

2. 分词与内容查找策略

  • 分词策略开关 (wordsplitenabled)
    • 类型: 布尔值
    • 默认值: True
    • 作用: 核心开关。当标签本身没有关联任何文章时,系统会将标签名称进行分词,然后用这些分词去查找标题中包含这些词的文章,用以填充标签页的内容列表。
    • 注意: 系统已从低效的“全表LIKE查询”优化为通过“分词中间表”进行关联查询,性能大幅提升。此功能处于过渡测试阶段。
  • 启用并发更新 (concurrentupdateenabled)
    • 类型: 布尔值
    • 默认值: False
    • 作用: 仅在wordsplitenabled=True时有效。当一篇已入库的文章首次被访问,且其标题尚未分词时,开启此选项将使用多线程/进程进行分词计算(会短暂阻塞HTTP主进程)。分词操作每个文章仅执行一次。
    • 警告: 默认关闭以确保稳定。开启后服务器进程数(pid)可能会短暂增加。

3. 内容补空策略

  • 补空策略 (fillemptystrategy)
    • 类型: 字符选项
    • 选项: random(随机文章)、recent(近期文章)、none(不补充)
    • 默认值: recent
    • 作用: 当通过“分词策略”仍然没有找到任何相关文章时,触发的后备方案。
  • 补空文章数量 (fillemptycount)
    • 类型: 整数
    • 默认值: 20
    • 验证器: 最小值1,最大值50
    • 作用: 定义使用“随机”或“近期”策略时,补充的文章数量。

4. 简介多样性配置

  • 简介多样性开关 (introdiversityenabled)
    • 类型: 布尔值
    • 默认值: False
    • 作用: 总开关。开启后,标签页的简介区域将使用下方随机的HTML模板内容。
  • 简介多样性模板 (introtemplates)
    • 类型: 多行文本 (支持HTML)
    • 默认值: 预置了10个不同样式的<div class="alert">模板
    • 作用: 简介模板池。模板之间用空行分隔。支持 {标签名称}{网站名称}占位符。系统随机选择一个使用。
  • 默认简介模板 (defaultintrotemplate)
    • 类型: 多行文本 (支持HTML)
    • 默认值: 一个基础的success alert模板
    • 作用: 当introdiversityenabled=False时,将固定使用此模板生成简介。同样支持 {标签名称}{网站名称}占位符。

主要方法说明

  • gettitletemplateslist()-> List[str]
    • 解析titletemplates字段,返回去空后的标题模板字符串列表。
  • getconnectortemplateslist()-> List[str]
    • 解析titleconnectortemplates字段,返回去空后的拼接模板字符串列表。内置容灾,返回至少包含["{标题1},{标题2}"]的列表。
  • getintrotemplateslist()-> List[str]
    • 解析introtemplates字段,按空行分割,返回简介模板字符串列表。
  • generatediversetitle(tagtitle: str)-> str
    • 标题生成核心逻辑
      1. titletemplates随机选取两个不同的模板。
      2. {标签名称}替换为实际tagtitle,得到标题1标题2
      3. connectortemplates随机选取一个拼接模板。
      4. {标题1}{标题2}替换进拼接模板,生成最终标题字符串。
    • 如果模板数量不足2条,会打印警告并返回空字符串。
  • getcompletetitle(tagtitle: str)-> str
    • generatediversetitle的封装,用于模板中直接调用。如果多样性标题开关关闭,返回空字符串。
  • generatediverseintro(tagtitle: str, objintro: str = None)-> str
    • 简介生成核心逻辑
      1. 如果传入了objintro(如标签自定义简介),则直接返回。
      2. 如果简介多样性开启,则从introtemplates随机选择一个模板,替换占位符后返回。
      3. 如果简介多样性关闭,则使用defaultintrotemplate替换占位符后返回。

使用示例

在Django视图(View)中调用:
 
# 假设在标签详情页的视图函数中
def tagdetailview(request, tagid):
    tag = getobjector404(Tag, id=tagid)
    config = TagPageConfig.getsolo() # 假设使用django-solo

# 生成页面标题 pagetitle = config.getcompletetitle(tag.title) # 如果pagetitle为空,可以使用一个默认标题 if not pagetitle: pagetitle = f"{tag.title}相关内容介绍"

# 生成页面简介 pageintro = config.generatediverseintro(tag.title, tag.customintro) # 假设标签模型有custom_intro字段

context = { 'tag': tag, 'pagetitle': pagetitle, 'pageintro': marksafe(pageintro), # 注意安全转义 } return render(request, 'tagdetail.html', context)

 
 
在模板(Template)中使用:
 
<!-- 在 head 中设置标题 -->
<title>{{ page_title }} - 我的网站</title>

<!-- 在页面主体中显示简介 --> <div class="tag-intro"> {{ pageintro|safe }} </div>

 
 

后台管理提示

  • 在Django Admin中编辑titletemplatestitleconnectortemplatesintrotemplates等字段时,每行输入一个模板。
  • introtemplatesdefaultintrotemplate字段支持HTML,请确保输入合法的HTML片段。