Obsidian 中按星期自动切换日记模板的实现方案
在 Obsidian 里,很多人会用 Calendar 插件点击当天日期,然后自动创建一篇日记。这个流程非常顺手,但默认情况下 Daily Notes 或 Periodic Notes 只能配置一个固定模板。
如果每天的节奏不同,比如周一适合做周计划,周五适合做复盘,周末适合记录休息和生活,就会遇到一个问题:点击 Calendar 日期时,如何自动调用周一到周日不同的日记模板?
这篇文章记录一个不修改插件源码的实现方案:保留 Calendar 原本的点击体验,用 Templater 把原来的日记模板改造成一个“模板路由器”,再根据日记文件名中的日期分发到对应的星期模板。
最终效果¶
实现后,原来的使用方式不变:
- 在 Calendar 插件中点击某一天。
- Obsidian 创建对应日期的日记文件,例如
2026-05-08.md。 - Templater 在文件创建时自动执行。
- 根据文件名判断这一天是星期几。
- 自动插入对应的模板,比如周五就插入
日记-周五.md。
也就是说,用户层面的操作仍然是“点日期,生成日记”,但底层模板已经可以按周一到周日自动分流。
为什么不直接改 Calendar 插件¶
Calendar 插件本身的职责是创建或打开日期笔记,它通常会读取 Daily Notes 或 Periodic Notes 的配置。直接修改插件逻辑当然也能做到多模板,但有几个明显问题:
- 插件升级后修改容易被覆盖。
- 插件源码维护成本更高。
- 这类需求本质上是模板选择逻辑,放在模板系统里更合适。
- Templater 已经提供了日期解析、文件 include、文件创建触发等能力。
所以更稳妥的方式是让 Calendar 继续指向同一个模板入口,然后由这个入口模板决定真正要加载哪一个子模板。
文件结构¶
原来的通用日记模板是:
005-template/日记.md
现在把它改成路由入口,并新增七个星期模板:
005-template/日记.md
005-template/日记-周一.md
005-template/日记-周二.md
005-template/日记-周三.md
005-template/日记-周四.md
005-template/日记-周五.md
005-template/日记-周六.md
005-template/日记-周日.md
七个星期模板初始内容可以全部从原来的 日记.md 复制。之后再逐步定制即可,比如:
- 周一模板增加周计划。
- 周三模板增加阶段检查。
- 周五模板增加本周复盘。
- 周六、周日模板增加休息、运动、生活记录。
日记模板路由器¶
新的 005-template/日记.md 不再保存完整日记内容,而是只保存一段 Templater 脚本:
<%*
const templatesByIsoWeekday = {
1: "005-template/日记-周一",
2: "005-template/日记-周二",
3: "005-template/日记-周三",
4: "005-template/日记-周四",
5: "005-template/日记-周五",
6: "005-template/日记-周六",
7: "005-template/日记-周日",
};
const date = moment(tp.file.title, "YYYY-MM-DD", true);
const weekday = date.isValid() ? date.isoWeekday() : moment().isoWeekday();
tR += await tp.file.include(`[[${templatesByIsoWeekday[weekday]}]]`);
%>
这段代码的核心点有三个。
第一,tp.file.title 是当前日记文件名。Daily Notes 的文件名格式是 YYYY-MM-DD,例如 2026-05-08。
第二,moment(tp.file.title, "YYYY-MM-DD", true) 会严格按日期格式解析文件名。解析成功后,用 isoWeekday() 得到星期数字:
1 = 周一
2 = 周二
3 = 周三
4 = 周四
5 = 周五
6 = 周六
7 = 周日
第三,tp.file.include() 会把对应模板的内容插入到当前日记中,并继续解析被 include 模板里的 Templater 语法。
这样 Calendar 仍然只知道一个模板入口,但 Templater 会在创建日记时自动完成二次分发。
保持 Obsidian 配置不变¶
这个方案不需要修改 Daily Notes、Periodic Notes 或 Calendar 的配置。
Daily Notes 仍然指向原来的模板入口:
{
"format": "YYYY-MM-DD",
"folder": "002-project/003-日记",
"template": "005-template/日记"
}
Periodic Notes 中的 daily template 也继续指向:
005-template/日记.md
Templater 需要开启文件创建时自动执行:
"trigger_on_file_creation": true
如果这个选项没有开启,Calendar 创建日记后只会插入模板源码,不会自动执行路由逻辑。
处理日期占位符兼容问题¶
原模板里可能会有 Calendar 或 Daily Notes 风格的日期占位符,比如:
{{DATE: YYYY-MM-DD-ddd}}
{{date:YYYY-MM-DD}}
当它们直接存在于 Daily Notes 模板里时,Obsidian 或相关插件可能会替换它们。但现在七个星期模板是通过 tp.file.include() 间接插入的,所以更稳妥的做法是统一改成 Templater 表达式。
替换前:
[{{DATE: YYYY-MM-DD-ddd}}](待处理任务-202401201627)
替换后:
[<% tp.date.now("YYYY-MM-DD-ddd", 0, tp.file.title, "YYYY-MM-DD") %>](待处理任务-202401201627)
替换前:
due before {{date:YYYY-MM-DD}}
替换后:
due before <% tp.date.now("YYYY-MM-DD", 0, tp.file.title, "YYYY-MM-DD") %>
这里关键是传入 tp.file.title 作为参考日期。否则模板会使用当前真实日期,而不是 Calendar 中被点击的那一天。
例如今天是 2026-05-08,但你点击 Calendar 里的 2026-05-04,如果不使用 tp.file.title,模板里的日期就可能错用今天。
验证方式¶
可以用一周连续日期验证路由是否正确:
2026-05-04 -> 周一 -> 日记-周一.md
2026-05-05 -> 周二 -> 日记-周二.md
2026-05-06 -> 周三 -> 日记-周三.md
2026-05-07 -> 周四 -> 日记-周四.md
2026-05-08 -> 周五 -> 日记-周五.md
2026-05-09 -> 周六 -> 日记-周六.md
2026-05-10 -> 周日 -> 日记-周日.md
生成日记后重点检查三件事:
- 内容是否来自对应星期模板。
- 文件中是否还残留
{{date:...}}或{{DATE:...}}。 - Tasks、Dataview、Buttons、QuickAdd 等代码块是否仍按原样工作。
如果七天都能正确生成,就说明路由逻辑已经稳定。
这个方案的优点¶
这个实现的好处是足够轻量:
- 不修改 Calendar 插件源码。
- 不修改 Periodic Notes 插件源码。
- 不改变原来的 Calendar 点击流程。
- 后续维护时只需要编辑七个普通 Markdown 模板。
- 可以渐进式定制,先复制原模板,再慢慢修改不同星期的内容。
它也比较适合迁移已有知识库,因为历史日记不会受到影响。只有之后新建的日记会走新的路由逻辑。
可继续扩展的方向¶
有了这个路由入口后,还可以继续扩展更多规则。例如:
- 工作日和周末使用不同模板。
- 每月第一天使用月计划模板。
- 每周最后一天自动插入周复盘模块。
- 根据文件夹或标签使用不同模板。
- 遇到特殊日期时加载节假日模板。
这些都可以在 日记.md 这个入口模板中继续扩展。核心思路不变:让创建日记的插件保持简单,把复杂的模板选择逻辑交给 Templater。
总结¶
Obsidian 的插件体系很灵活,但很多时候不需要改插件源码。对于“Calendar 点击日期后按星期使用不同日记模板”这样的需求,最稳的实现方式是:
- Calendar 继续指向同一个日记模板。
- 把这个模板改成 Templater 路由入口。
- 用日记文件名解析星期几。
- 通过
tp.file.include()插入对应的周一到周日模板。 - 把子模板里的日期占位符统一改成基于
tp.file.title的 Templater 表达式。
这样既保留了原来的操作手感,又让日记系统具备了按星期自动变化的能力。