自定义代码表达式

DeerU只提供了几个简单的代码表达式,你可以根据需要自定义你的表达式,

另外:表达式的名字最终会转为小写,因此IMG和Img是重名的,为了防止重名,自定义的表达式建议以自己的名字开头

注解

为了方便,以下所说的表达式特指代码表达式


编写自定义表达式

下面我们开始创建自定义表达式:

  1. 新建一个python包,以及py文件,

my_ex/
    __init__.py
    custom_expression.py
  1. 把你的py文件加入 settings_local.pyCUSTOM_EXPRESSION

CUSTOM_EXPRESSION=['my_ex.custom_expression']
  1. 编写一个你的表达式类,继承 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标签(在最早版本的表达式中,就是这样做的)

不过建议返回字典或字符串,这样更利于主题开发者使用你的表达式返回结果