3. 主题(皮肤)¶
Wtxlog 支持主题切换功能(换肤功能), 可以准备多套主题, 只需简单设置就可以轻松切换.
主题 也可以理解为 皮肤.
3.1. 主题¶
Wtxlog 使用 flask-themes 作为主题管理工具. 主题目录下包含若干模板文件.
3.1.1. 文件结构¶
下面是默认主题的文件结构:
├── info.json ├── static └── templates ├── account ├── mobile ├── errors ├── archives.html ├── article.html ├── article_lists.html ├── category.html ├── flatpage.html ├── index.html ├── layout.html ├── search.html ├── tag.html ├── tags.html ├── topic.html └── topics.html
主要由3部分组成: info.json, static, templates, 说明:
info.json
模板描述文件
static
静态文件夹, 放置 JavaScript/CSS 等文件
template
模板文件夹
3.1.1.1. info.json¶
示例:
{ "application": "wtxlog", "identifier": "imtx", "name": "imtx theme", "author": "digwtx", "description": "imtx.me theme", "license": "MIT/X11", "doctype": "html5" }
application
应用程序标识符, 必须需为
wtxlog
identifier
主题标识符, 不能存在两个标识符相同的主题
name
易于人理解的主题名字
author
主题作者
description
主题描述
license
主题许可证
doctype
主题HTML版本
更多内容参考: http://pythonhosted.org/Flask-Themes/#info-json-fields
3.1.1.2. templates¶
| 文件名 | 说明 |
|---|---|
| archives.html | 归档 |
| article.html | 文章内容页 |
| article_lists | 文章列表页 |
| category.html | 栏目内容页, 显示某个栏目所有的文章 |
| flatpage.html | 简单页面内容页 |
| index.html | 首页 |
| layout.html | 布局页面(可自定义, 非必需) |
| search.html | 搜索结果页 |
| tag.html | Tags标签内容页, 显示某个Tag所有的文章 |
| tags.html | Tags标签聚合页, 显示所有Tags标签 |
| topic.html | 专题内容页, 显示某个专题所有的文章 |
| topics.html | 专题聚合页, 显示所有专题 |
| errors/403.html | 403错误页 |
| errors/404.html | 404错误页 |
| errors/500.html | 500错误页 |
| mobile/* | 移动端模板文件夹, 文件结构与上面相同(上面的电脑版模板) |
3.1.1.3. 模板写作技巧¶
主题模板引用:
可以使用 theme(template_name) 引入模板文件, 比如:
{% extends theme('layout.html') %}
主题静态文件:
可以使用 theme_static 环境处理器引用主题下的静态文件, 比如:
<link rel=stylesheet href="{{ theme_static('style.css') }}">
3.2. 模板¶
模板语法与 Jinja2 相同.
3.3. 过滤器¶
Jinja2所有内置的过滤器都是可以使用的. 本文介绍的是定制的一些过滤器:
3.3.2. date¶
日期格式化, 格式化选项与Python标准相同.
3.3.3. timestamp¶
时间戳格式化, 格式化选项与Python标准相同.
3.4. 上下文处理器¶
本文介绍程序内置的一些 上下文处理器, 可在模板文件中直接使用.
上下文处理器 在模板渲染之前运行, 并且可以在模板上下文中插入新值.
3.4.1. archives¶
返回从第一篇文章开始到现在所经历的月份列表
3.4.5. category_tree¶
返回栏目树形列表.
3.4.7. get_latest_articles¶
返回最新文章列表.
参数:
category文章栏目, 如果指定, 则返回当前栏目(含子栏目)的最新文章, 否则返回全局的limit限制返回的数量, 默认为10
3.4.8. get_top_articles¶
返回热门文章列表, 根据 hits 降序.
参数:
days天数, 比如显示一周热门, 就可以设置为7, 默认为365, 即按年筛选limit限制返回的数量, 默认为10
3.4.9. get_recommend_articles¶
返回推荐的文章列表.
参数:
category文章栏目, 如果指定, 则返回当前栏目(含子栏目)的最新文章, 否则返回全局的limit限制返回的数量, 默认为10
3.4.10. get_thumbnail_articles¶
返回有缩略图的文章列表.
参数:
category文章栏目, 如果指定, 则返回当前栏目(含子栏目)的最新文章, 否则返回全局的limit限制返回的数量, 默认为10
3.4.11. get_articles_by_category¶
根据栏目路径(longslug)返回文章列表.
参数:
longslug栏目路径, 字符串, 不要以/结尾limit返回的个数, 整数expand是否返回子栏目文章, 若为False则只返回当前栏目的文章
3.4.12. friendlinks¶
返回友情链接列表.
3.4.14. model_query¶
模型复杂查询
参数:
model实例模型, 比如Article,Category,Tag, etc.search_params参数字典, 为dict类型, 参照 flask-restless文档
示例:
{% set longslug = '' %} {% if article %}{% set longslug = article.category.longslug %}{% endif %} {% if category %}{% set longslug = category.longslug %}{% endif %} {% with recent_articles = model_query(Article, {'order_by': [{'field': 'id', 'direction': 'desc'}], 'limit': 15, 'filters': [ {'name': 'category_id', 'op': 'in', 'val': get_category_ids(longslug)}, {'name': 'published', 'op': 'eq', 'val': True}], }) %} {% for article in recent_articles -%} <li><a href="{{ article.link }}">{{ article.title }}</a></li> {% endfor %} {% endwith %}
因为这个方法使用相当复杂(参数看起来比较多, 语法略为复杂), 所以只有当上面列举的上下文处理器无法实现某个查询功能时, 才建议使用这个方法来实现.