自定义代码表达式¶
DeerU只提供了几个简单的代码表达式,你可以根据需要自定义你的表达式,
另外:表达式的名字最终会转为小写,因此IMG和Img是重名的,为了防止重名,自定义的表达式建议以自己的名字开头
注解
为了方便,以下所说的表达式特指代码表达式
编写自定义表达式¶
下面我们开始创建自定义表达式:
新建一个python包,以及py文件,
my_ex/
__init__.py
custom_expression.py
把你的py文件加入
settings_local.py
的CUSTOM_EXPRESSION
中
CUSTOM_EXPRESSION=['my_ex.custom_expression']
编写一个你的表达式类,继承
app.deeru_expression.expressions.BaseExpression
,并重写calculate()
函数 format_expression()
解析表达式时会把表达式分为 表达式名、参数 两部分,
这里再次强调以下,表达式名(也就是类名)最终会转为小写
参数 会放到类的成员变量 args 里
表达式名、参数 一定是用’|’分割开,如: {% text | some args %}
参数部分没有限制,你可以仍然用’|’分割,也可自定义你的参数格式
calculate()
的作用是解析参数,并返回需要的结果,它会在执行 get_result()
时调用。注意: calculate()
只会在第一次调用 get_result()
时执行,
后面将返回缓存的结果,因此同一个表达式实例不能重复使用
from app.deeru_expression.expressions import BaseExpression,get_attrs
class MText(BaseExpression):
"""
字符表达式
{% text| 值 [ | 其他属性] %}
返回{
'text':'xx',
'attrs':{
'style':'xx'
}
}
"""
def calculate(self):
if not self.args:
self.args = ''
# 这里默认用'|'分割
args = self.args.split('|')
if len(args) == 0:
raise ExpressionTypeError('表达式 text 至少需要一个参数')
text = args[0]
if len(args) > 1:
attrs = get_attrs(args[1:])
else:
attrs = {}
return {
'text': text,
'attrs': attrs
}
至此你已经成功编写了一个表达式,载入表达式需要重启工程
注解
函数 calculate()
并没有限制返回的数据类型,你可以返回字符串、字典或者html标签(在最早版本的表达式中,就是这样做的)
不过建议返回字典或字符串,这样更利于主题开发者使用你的表达式返回结果