获取数据

获取文档

get_data

这是FarBox中获取数据的主要函数, 它让你调用数据库的逻辑去查询自己的文件夹与文件。
所有的参数,按需调用即可。

接受的参数

types

FarBox中有五种文档类型, post(为默认值)、folder、image、file、template, 可使用+连接,比如post+folder,或者['post', 'folder']

type

同types,但不接受+号连接, 仅能声明一种类型,并且使用了这个参数后,types参数将会无效。

path

默认为/(相当于站点根目录), 限定查询数据的路径,比如path='docs/', 则表示仅查询docs/这个目录下的数据。

level

配合path使用的,表示所查询path的深度。如果level=1,表示仅查询到其子目录,level=2,则仅查询子目录的子目录;也接受[2,3]这样形式的值,表示查询所有2级以及3级的目录,但不包含更深的路径,也不包含1级子目录。

另外接受>n 或者<n 类型的参数,比如>1,表示2级目录或以上。

sort

排序类型,有五种值可选:

  • desc, 按时间倒序(默认值)
  • asc, 按时间正序
  • position, 按照文档的自定义位置排序(正序)。
  • score, 按照默认的dig灵敏度排序的最近热文
  • _score, 按照自定义灵敏度排序的最近热文
  • -m_date, 按照文件最后修改时间倒序,评论文章,也会导致m_date的变动。

limit

一次取出多少条数据,如果limit=1并且with_page=False,那么返回的结果不再是列表,而是唯一一条的数据对象本身。

page

取得第几页的数据,如果没有声明,则默认为1或者取URL中形如/URL/PATH/page/<page_number>作为page的参数。

with_page

是否启用分页;如果为True(默认值),则limit将会被当做每页多少条。

pager_name

分页标记值, 建议使用这个参数! 页面在渲染过程中,可能会产生多个分页对象,调用get_data的时候可以为新创建的分页对象指定名称;这样在后续调用分页数据的时候,就不容易产生混乱。

date_start

文档的时间(即date字段)大于某个时间(不包括等于的情况)。

date_end

文档的时间小于某个时间(不包括等于的情况)。

min_posts_count

最少包含多少篇日志,针对post、folder类型的文档有效,所有的post类型,posts_count都为1。

如果目录名以_开始,则不会统计,比如_draft

min_images_count

最少包含多少张图片,针对image、folder类型的,所有的image类型,images_count都为1。

如果目录名以_开始,则不会统计, 比如_image

return_count

默认为False, 如果设为True,那么整个查询不返回结果,仅返回一个匹配到的文档数。

仅针对post类型有效的参数

status

默认的post状态为public, 其它值都是由文章作者按需自定义的。
status中有一个值是特殊的,为all; 它代表输出所有的状态。所以,需要注意下,不要用all来定义某一篇post的status。

如果没有传递keywords这个参数,那么status可以是一个列表, 比如status=['public', 'protected', 'my_status']

url_path

自定义的url查询,如果使用这个参数,则with_page=False, limit=1, 也就是仅返回一条结果或者空值。

tags

用户给post打上的标签,以是'tag1+tag2'或者['tag1', 'tag2'],两者等价。

keywords: 全文搜索

这个查询是针对全文的搜索,关键词最多不超过50个字(会自动进行分词)。查询的范围包括标题、以及正文内容。

使用keywords的时候,min_images_count、min_posts_count这些参数不会生效。

sort参数,不支持_score、score、-m_date;如果有score排序的需要,可以在获取搜索结果后,重新排序即可。

当使用keywords参数后,另外可以使用两个新的sort参数,为slot2-slot2(倒序)。

说明,slot1 & slot2两个属性来专门用于搜索的扩展属性。其中slot1是搜索字段的扩展,slot2为排序字段的扩展。

search_fields

这个是对keywords字段的补全,非全文搜索的情况下无效。默认值为['title', 'raw_content'], 表示对标题以及正文进行搜索。

除了titleraw_content外,另外支持的一个字段是slot1

注意事项

  • 各个参数,按需使用。
  • 使用limit参数,会自动产生一个paginator(分页)的数据对象,如果使用limit的同时,也使用了page这个参数,则paginator对象不会产生。
  • 当一个参数具有针对性的type的时候,那么多个types混合,其它类型的数据则无法获取,比如get_data(types='post+folder', status='public'),那么结果集中仅会有post的数据。

get_doc

根据指定的路径获得一个文档/文件的函数。接受1个参数path。path不能为空。

get_connected_one

获取doc相同类型的上一个、下一个(按照日期排序)文档数据,接受参数<doc> <same_folder> <position>

doc: 文档对象,比如通过get_doc获得的值
same_folder: None/True/False, 如果是True,则表示与doc是位于同一个目录的;如果是False,则是整个网站的范围。如果不指定,即None, 表示如果是日志类型的,整个网站范围;反之,则是同目录范围。
position: ><, 表示下一个或上一个。

'get_connected_one'实际上可以直接用get_data来获取,它在服务器上的逻辑代码如下:

if 'date' not in doc:
    return
if (same_folder is None and doc.get('type') == 'post') or not same_folder:
    path = None
else:
    path = '/'.join(doc.get('path').split('/')[:-1]) + '/'
if position == '>':
    return get_data(type=doc.get('type'), path=path, limit=1, with_page=False, date_end=doc.get('date'), sort='desc')
else:
    return get_data(type=doc.get('type'), path=path, limit=1, with_page=False, date_start=doc.get('date'), sort='asc')

文档属性

文档/Doc是指在你站点目录内的各种文件资源,包括文章、图片、CSS/JS文件、文件夹等。
get_data一般会返回文档对象的列表,而get_doc/get_connected_one则返回一个文档对象。

基础属性

变量名 描述
path 相对于站点目录的路径,全小写
full_path 文档的完整路径, 全小写
raw_path 文档的完整路径, 保留大小写
parent_path path的父目录路径
parent_full_path full_path的父目录路径
parent_raw_path raw_path的父目录路径
type 文档类型,有folder/post/image/file四种
title 标题
date 文档的时间,比如可作为文章的发表时间
m_date 文档最后修改时间,评论文章也会导致m_date变动
raw_date 文档的最后修改时间
position 用户自定义的位置, 浮点数类型
size 文档的大小
content_type 内容类型,比如image/jpeg
visits 页面访问数
_visits 在不改变文件路径的前提下,约等于访问IP数
content 如果没有特殊说明,是文档的源数据
ext 文件后缀名,比如jpg txt

post类型专有属性

post类型,即文件后缀名为.txt .mk .md .markdown的文档。

变量名 描述
content HTML格式的正文
toc TableOfContens, HTML格式
status 文章的属性,默认为public
cover 文章封面, 从内容中提取出来的第一张图片
raw_content 纯文本格式的正文,不包含metadata
_content 原始正文,包含metadata信息
metadata post的扩展属性
tags 标签, 列表类型
url_path 自定义的url
url '/post/’+url_path 或 /+url_path,视情况而定
comments_count 评论数
posts_count 恒等于1

补充说明:

  • 如果用户没有自定义url_path,则系统会根据其文件路径,自动生成一个url_path
  • 正文中如果没有图片,则cover为None
  • url只是一种约定的规则,如果负责处理文章详细页的不是template/post.html,则这个url是无效的,需要自己根据url_path组装。
  • 在调用content的时候,如果没有设置使用toc,那么,正文内的字符串[TOC]会被toc内容替换。

image类型专有属性

变量名 描述
url 图片的网址
image_width 图片宽
image_height 图片高
exif 图片的exif信息,对象/字典类型
comments_count 评论数
images_count 恒等于1

image. exif属性

变量名 描述
make 设备生产商,如 Apple
model 设备型号, 如 iPhone 4
datetime 照片拍摄时间, 如 2012:10:17 18:22:14
fn 光圈值
flash 曝光模式,整数
focal_length 焦距
exposure 曝光(快门)时间
iso ISO值
program 拍摄模式,0-8
latitud 纬度,北纬为正、南纬为负数
longitude 经度,东经为正、西经为负数
altitude 海拔高度
height 拍摄原图高度
width 拍摄原图宽

folder类型专有属性

变量名 描述
content HTML格式的正文
raw_content 纯文本格式的正文,不包含metadata
_content 原始正文,包含metadata信息
metadata 扩展字段
posts_count 包含的文章数(含子目录)
images_count 包含的图片数(含子目录)
_posts_count 包含的文章数(不含子目录)
_images_count 包含的图片数(不含子目录)
url 在images_count不为0的前提下,会指向最后修改过的一张图片,视为封面

content/raw_content/_content/metadata的属性来自于文件夹下index.txt这样的文档,如果有的话。

其它相关数据

get_paginator

这是一个获取分页的函数,接受单个参数index。index为第几个分页信息,默认为0,即第一个分页信息。

index也接受字符类型的参数,为pager_name;也就是在get_data函数中声明的分页标记值。

使用get_data或者get_comments的时候,并且传递的参数中没有page这个参数,那么,都会产生一个Paginator类型的分页。每页的数据条数,对应到limit这个参数。

如果使用的是get_data函数,并且传递了参数with_page=False, 则不会产生分页数据。

代码示例:

{% set posts = get_data(type='post', limit=3, pager_name='posts') %}
{% set images = get_data(type='image', limit=10) %}
{% set p1 = get_paginator(0) %}
{% set p1_2 = get_paginator('posts') %}
{% set p2 = get_paginator(1) %}

如代码所示,p1是posts的分页信息,每页3条;p2是images的分页信息,每页10条。另外p1_2p1是同一个分页信息。

获得的paginator(p1或p2),默认都会用页码来补全URL,比如,访问/URL的时候,那么/URL/page/2就表示第二页。

注意:不要在同一个页面中混用多个paginator,因为URL传递的page页码对多个paginators来说,都是公用的; 如有特殊需求,则需要在get_data的时候,需要指定page这个参数。

paginator属性列表

变量名 描述
per_page 每页数量
object_list 当前页的对象列表,比如posts files,不常用
total_count 查询对象的总数
total_pages 总共多少页
page 当前是第几页
previous_page 上一页页码
pre_page 同previous_page
previous_page_url 上一页的url
pre_page_url 同previous_page_url
next_page 下一页页码
next_page_url 下一页的url
has_next 是否有下一页 True/False
has_previous 是否有上一页 True/False
has_pre 同has_previous

代码示例

一个比较常见的,对paginator处理的代码。

{% if paginator.has_previous or  paginator.has_next %}
    <div class="pager">
        {% if paginator.has_previous %}
            <a class="round pre" href="{{ paginator.previous_page_url }}">上一页</a>
        {% endif %}
        {% if paginator.has_next %}
            <a class="round next" href="{{ paginator.next_page_url}}">下一页</a>
        {% endif %}
    </div>
{% endif %}

get_comments

接收参数<parent> <limit> <sort>.
如果parent为空,则会获得当前站点下的所有评论。
通常在文章详细页面中,使用post来做parent,从而获得当前文章的评论列表。
代码示例:

{% set comments = get_comments(post) %}

comment属性列表

变量名 描述
content 评论内容,已经HTML格式化
raw_content 评论内容,未格式化
author 评论者称呼
site 评论者网站地址
date 评论日期
email_md5 Email地址对应的md5值
ip 如果有的话,表示评论者的IP

comment.email_md5可用于取头像,比如 http://www.gravatar.com/avatar/{{ comment.email_md5 }}

is_comment_allowed

接受一个doc参数,即当前的doc是否允许评论。一般会传入context_doc,比如{{ is_comment_allowed(context_doc) }}

context_doc,是由add_doc_actions运行产生的。

默认变量

site

当前被访问的网站。

属性列表

变量名 描述
_id site_id
title 网站的标题
site_path 字符全部小写,/site_folder_name/
domains 网站的域名(多个), 数组型
tags 当前网站(public)日志的tags,数据类型为数组,tag_name+tag_count
avatar 网站所有者的头像地址
configs 网站的自定义属性
content 网站的描述(HTML)
raw_content 网站的描述(TXT)
template_key 网站模板包的key值
owner_template_key 网站自行打包的模板包的key值
config_path 当前生效的网站配置文件,比如site.txt
comment_script 网站目录下comment_js.txt(md/mk/markdown)的内容

site.tags

1,site.tags是按照标签对应的文章数,倒序输出,形如:

[('tag 1',3), ('tag 2', 1)]

2,site.tags模板代码示例:

{% for tag_name, tag_count in site.tags %}
{{ tag_name }}, {{ tag_count }} </br>
{% endfor %}

3, site.tags统计的是所有staus=public的日志,同时,如果单个tag内含:字符的,则不算入内。

site.title

默认值是你网站目录的名称, 或等价于site.configs.title

request

当前用户的(浏览器)请求信息。

属性列表

变量名 类型 描述
host 字符串 域名
form 字典 通过POST\PUT方式的传值
args 字典 通过GET方式的传值
values 字典 合并了form & args
method 字符串 GET POST PUT
json 字典 客户端发送的mimetype是application/json,则此变量存在
xml 字典 跟json字段功能类似
is_login 布尔值 当前用户是否已登录
is_admin 布尔值 当前用户是否是站长
language 小写字符串 当前访客浏览器的语言,比如zh_cn
path 字符串 -
url 字符串 -
base_url 字符串 -
url_root 字符串 -
url_without_host 字符串 -
protocol 字符串 http or https
is_https 布尔值 True/False

注意,is_login/is_admin也可以在客户端的Cookie中获取,但Cookie中仅能作为标记符,如果涉及读、写权限的操作,服务器有自己的session进行判断。

request.path

假设http://www.example.com/page.html?x=y 被访问,则request有以下几个变量。

变量名
path /page.html
base_url http://www.example.com/page.html
url http://www.example.com/page.html?x=y
url_root http://www.example.com/
request.url_without_host /page.html?x=y

常用变量

1, 常用变量是自动套用get_data函数获得的数据,如果页面的逻辑比较复杂,我们建议直接使用get_data来获取数据,从而避免不必要的冲突。
2, 一般情况下,不要直接使用常用变量作为if/else的判断逻辑,比如 {% if posts %}这个判断,如果posts不是自己通过get_data获取的,那么基本上都是有返回值的。

next_one

按照时间的排序,下一个同类数据,比如下一篇文章。等价于get_data(type=context_doc.type, date_end=context_doc.date, sort='desc', limit=1, page=1)

pre_one

类似 next_one,等价于get_data(type=context_doc.type, date_start=context_doc.date, sort='asc',limit=1, page=1)

categories

站点目录,2层之内的日志的分类(文件夹)。
等价于get_data(type='folder', level=[1,2], min_posts_count=1)

cateogry

当URL路径为/any_thing/<folder-path>的时候,会去尝试获得一个对应的folder。注意,此时的必须要以/结尾
等价于get_doc(path=get_request_path(offset=1))

folder

等价于category

tags

等价于get_request_path(offset=1).split('+')
如果访问/any_thing/tag1+tag2, 再调用{{ tags }}的时候,获得的是['tag1', 'tag2']

posts

第一种情况: 当使用了category并且有数据的时候,会获得当前目录下的post集合;相当于get_data(type='post', path=category.path);

第二种情况:当使用了tags并且有数据的时候,会获得对应tags下的post集合;相当于get_data(type='post', tags=tags);

第三种情况: 当访问/feed的时候,会输出10条posts,相当于get_data(type='post', page=1, limit=10)

第四种情况: 当通过anything/?s=keywords访问的时候,则会获得关键词对应的post集合,相当于type='post', keywords=request.args.get('s'))

最后一种情况:如果之前的都无匹配,则会返回整站得post集合,相当于get_data(type='post')

files

第一种情况: 位于某个目录下的,返回其下直接的相册+图片,相当于get_data(types='folder+image', path=folder.path, min_images_count=1, level=1);

第二种情况:返回整站根目录下的相册+图片,相当于get_data(types='folder+image', min_images_count=1, level=1)

images

第一种情况: 位于某个目录下的,返回其下直接的图片,相当于get_data(types='image', path=folder.path, level=1

第二种情况:返回整站的所有图片,相当于get_data(types='image')

albums

第一种情况: 位于某个目录下的,返回其下直接的相册,相当于get_data(types='folder', path=folder.path, level=1, min_images_count=1

第二种情况:返回整站根目录下2级目录内的前100个相册并自动分页,相当于get_data(types='folder', min_images_count=1, level=[1,2], limit=100)

post

获得对应url_path的post,并且可以进行评论、显示源文档、记录访问数等功能。

相当于{% set post = get_data(type='post', url_path=get_request_path(offset=1), limit=1, page=1) %}, 然后再{{ add_doc_actions(post) }}

file

获得对应路径的文档,可能是file/image/folder的其中一种类型,并且可以进行评论、记录访问数的功能。

相当于{% set post = get_doc(path=get_request_path(offset=1)%}, 然后再{{ add_doc_actions(post) }}

paginator

相当于get_paginator(0),如果你感觉取得的结果不是预期的,建议使用原生的函数get_paginator

比如在首页中:

{% for post in posts %}
    {{post.title}}
{% endfor %}
{{ paginator.page }} {# 这时paginator是有效的#}

{% for post in get_data(type='post') %}
    {{post.title}}
{% endfor %}
{{ paginator.page }} {# 这时paginator是无效的,它先于get_data这个函数执行了#}
{# get_paginator(0).page 这时,这样的写法是有效的。#}

pager

同paginator

comments

相当于get_comments()

其它变量

sites

当前登录账户所拥有的站点列表。

account_id

当前登录账户的ID

account

当前登录账户的信息。

字段名 说明
service 云服务商,目前为Dropbox
uid UID
utc_offset 时区
created_at 创建时间
last_login_at 最后登录时间
synced_at 最后同步时间
name 根据其邮箱地址获取的名称
email_md5 邮箱的MD5值,常用来获取头像

context_doc

上下文数据对象,使用add_doc_actions这个函数后,会自动将add_doc_actions(doc)中的doc作为context_doc

raw_comment

用户提交的评论。

字段 说明
content 评论内容
author 评论者称呼
email 评论者邮箱
site 网站地址
error 如果评论出错,则是出错原因

path1

针对当前访问路径,获取其第一部分。

'/abc/de/fad' --> abc
'/abc/de/~~fad' --> abc/de

path2

针对当前访问路径,获取其第一部分之外的。

abc/de/fad' --> de/fad
'abc/de/~~fad' --> fad

interface

模板包配置项中的interface,用以控制默认的网站的后台管理。

template_key

网站正在使用的克隆模板的key值。

template_packages

由FarBox官方提供的默认模板数据列表。

template_package

返回当前网站在使用的模板包,如果有的话。

特殊属性与格式化

一些字段、属性在页面呈现的时候,需要不同的格式支持。为了让API调用更加人性化,我们对一些常见的属性类型进行了重新封装。

Date

直接使用(比如{{post.date}}),默认返回2012-12-22 10:11的格式。

format

指定TimeFormat,进而格式化日期的函数

代码示例:

{{ post.date.format('%Y-%m-%d') }}
   # 最终格式为 2012-12-22

before

接受一个整数参数,表示?秒之前的时间,返回一个新的Date对象。

after

同before,表示?秒之后的时间。

TimeFormat

%a 本地的星期缩写
%A 本地的星期全称
%b 本地的月份缩写
%B 本地的月份全称
%c 本地的合适的日期和时间表示形式
%d 月份中的第几天,类型为decimal number(10进制数字),范围[01,31]
%f 微秒,类型为decimal number,范围[0,999999],Python 2.6新增
%H 小时(24进制),类型为decimal number,范围[00,23]
%I 小时(12进制),类型为decimal number,范围[01,12]
%j 一年中的第几天,类型为decimal number,范围[001,366]
%m 月份,类型为decimal number,范围[01,12]
%M 分钟,类型为decimal number,范围[00,59]
%p 本地的上午或下午的表示(AM或PM),只当设置为%I(12进制)时才有效
%S 秒钟,类型为decimal number,范围[00,61](60和61是为了处理闰秒)
%U 一年中的第几周(以星期日为一周的开始),类型为decimal number,范围[00,53]
%w 星期,类型为decimal number,范围[0,6],0为星期日
%W 一年中的第几周(以星期一为一周的开始),类型为decimal number,范围[00,53]
%x 本地的合适的日期表示形式
%X 本地的合适的时间表示形式
%y 去掉世纪的年份数,类型为decimal number,范围[00,99]
%Y 带有世纪的年份数,类型为decimal number
%Z 时区名字(不存在时区时为空)
%% 代表转义的"%"字符

Text

目前仅仅对content字段生效。

plain

输出仅有换行格式的平文本。但如果原文有HTML标签,并不会转义。

safe_plain

同plain这个属性,但是会对HTML标签进行转义。

without_toc

针对post类型,内容不包括toc部分。

opening

如果content中有<!--more-->(单独一行)的话,则会返回被它分割后的第一部分。

如果你在写日志是,特别进行了这个标注,则需要调用{{ post.content.opening }}

如果没有这个标注的话,则返回空文本。

limit

limit函数可截取内容的前面部分,接受两个参数,length表示截取的长度,with_mark则表示如果截取的部分并不是全文,则默认追加在后面的字符串,默认为......

同时,返回的结果,还有两个属性,一个为more,表示是否还有更多的内容;一个为no_pic,即将内容中的img标签去除。

{% set content = post.content.limit(100, '...')  %}
    <div> {{ content }} </div>
{% if content.more %}
    <a href="#">Read More</a>
{% endif %}

其它

post.content[0:100] # 正文的前100字,纯文本,非HTML格式。
post.content(100) # 正文前100字,HTML格式。

ImageURL

仅仅针对image类型的url属性。

举例说明:

{{ image.url }} 图片的原始地址
{{ image.url(width=50, height=50, fixed=True) }} 50像素的正方形缩略图
{{ image.url(width=50, height=50) }} 宽、高不超过50像素的缩略图

image.url除了直接使用之外,也可以当做函数一样进行调用,接受下面几个参数(按需声明):

参数 说明
width 图片宽,整数类型
height 图片高,整数类型
fixed 是否定尺寸裁剪,True/False
auto 图形是否自动增强, True/False

由于图片的处理会消耗比较大的计算资源,FarBox会自动处理图片的边界,比如width=550,我们最终会转化为临近的640.

参数 说明 最终转化的可能值
width 图片的宽 [40, 80, 160, 214, 320, 428, 640, 960, 1280]
height 图片的高 [40, 80, 160, 214, 320, 428, 640, 960, 1280]

FarBox默认返回的图片尺寸最大不超过1280*1280,当原图尺寸超过这个的时候,可以请求 image.url.large,这样会返回一张最大不超过1560*2560的大图。

List

下列函数,只有对象类型是列表的时候,才会生效。另外,下列的函数,基本都是一次甚至多次遍历,如果在一个页面内数据较多并且多次执行,可能会导致页面超时,而渲染失败。

sort_by

对数组进行重新的排序,仅接受一个参数attr(根据某个属性排序),如果attr前面以-开头,则表示结果倒序。

{{ posts.sort_by('position') }}  # 按照自定义的位置排序
{{ posts.sort_by('-position') }} # 按照自定义的位置倒序
{{ posts.sort_by('date.year') }} # 按照日志的发表年份排序

group

对列表进行重新归档,仅接受一个参数attr(根据某个属性排序),如果attr前面以-开头,则表示结果倒序。

如果是多个子属性的混合,可以使用attr:sub_att1+sub_attr2, 比如posts.group('date:year+month');如果子属性是一个列表型的值,则会对列表里的每个值进行归档,比如posts.group('tags')

归档的返回值也是一个列表,每个元素的形式为:[group_key, [item1, item2, item3, .etc]]。


代码示例,(默认模板中)我们可以对一个日志列表按照Tags或年份进行归档。

{% set posts = get_data(type='post', limit=300, sort='desc') %} 
{% if request.args.use == 'tags' %}
    {% set entries = posts.group('tags') %}
{% else %}
    {% set entries = posts.group( 'date:year') %}
{% endif %}

最终获得的entries形如:

[
    (2013, [<post1>, <post2>, <post3>]),
    (2012, [<post1>, <post2>]),
]

通过以下方式进行页面的呈现。

<ul>
    {% for year, posts in entries %}
        <li>{{ year }}</li>
        <ul>
        {% for post in posts %}
            <li>{{ post.title }}</li>
        {% endfor %}
        </ul>
    {% endfor %}
</ul>

注意:归档的倒序,只是组与组之间的,比如2013年这个组可以排在2012年之前,但是组内的元素次序,仍然是原来的次序。

filter

用来过滤一个列表性质的数据。接受两个参数,一个为attr, 一个为attr_value, 判断的依据是数据对象的属性(attr)完全等于指定值(attr_value);如果attr_value是一个列表,那么对象的属性值在这个列表内的讲作为判断依据。

比如objects = [{value:1}, {value:2}, {value:1}]

那么objects.filter('value', 2) 将会返回[{value:2}]。

pick

objects = [
    {path: "1"},
    {path: "2"},
    {title: "hello"}
]

这时objects.pick('path') 会返回['1', '2']; 即从列表的对象中取特定字段,形成新的列表。

add

add(obj, position=-1), 可以往列表中添加一个对象,默认的position=-1表示于最后的位置添加。

add这个命令会尽可能避免新元素(如果是一个数据对象)与旧列表的冲突。如下例子:

posts = [<p1>, <p2>, <p3>]
new_post = <p2>
posts.add(new_post, 0)
最终的posts = [<p2>, <p1>, <p3>]

json

如果对象的类型是数组或者字典,那么,可以直接使用其json属性,将原对象转为json格式。如果转化失败,则返回原对象。

代码示例:

{% set posts = get_data(type='post', limit=10) %}
{{ posts.json }}