自定义代码表达式
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标签(在最早版本的表达式中,就是这样做的)
不过建议返回字典或字符串,这样更利于主题开发者使用你的表达式返回结果