自定义代码表达式

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

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

注解

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


编写自定义表达式

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

  • 新建一个python包,以及py文件,
  1. my_ex/
  2. __init__.py
  3. custom_expression.py
  • 把你的py文件加入 settings_local.pyCUSTOM_EXPRESSION
  1. CUSTOM_EXPRESSION=['my_ex.custom_expression']
  • 编写一个你的表达式类,继承 app.deeru_expression.expressions.BaseExpression,并重写 calculate()函数 format_expression() 解析表达式时会把表达式分为 表达式名、参数 两部分,

这里再次强调以下,表达式名(也就是类名)最终会转为小写

参数 会放到类的成员变量 args 里

表达式名、参数 一定是用’|’分割开,如: {% text | some args %}

参数部分没有限制,你可以仍然用’|’分割,也可自定义你的参数格式

calculate() 的作用是解析参数,并返回需要的结果,它会在执行 get_result() 时调用。注意: calculate() 只会在第一次调用 get_result() 时执行,后面将返回缓存的结果,因此同一个表达式实例不能重复使用

  1. from app.deeru_expression.expressions import BaseExpression,get_attrs
  2.  
  3.  
  4. class MText(BaseExpression):
  5. """
  6. 字符表达式
  7. {% text| 值 [ | 其他属性] %}
  8.  
  9. 返回{
  10. 'text':'xx',
  11. 'attrs':{
  12. 'style':'xx'
  13. }
  14. }
  15. """
  16.  
  17. def calculate(self):
  18. if not self.args:
  19. self.args = ''
  20.  
  21. # 这里默认用'|'分割
  22. args = self.args.split('|')
  23.  
  24. if len(args) == 0:
  25. raise ExpressionTypeError('表达式 text 至少需要一个参数')
  26.  
  27. text = args[0]
  28. if len(args) > 1:
  29. attrs = get_attrs(args[1:])
  30. else:
  31. attrs = {}
  32.  
  33. return {
  34. 'text': text,
  35. 'attrs': attrs
  36. }

至此你已经成功编写了一个表达式,载入表达式需要重启工程

注解

函数 calculate() 并没有限制返回的数据类型,你可以返回字符串、字典或者html标签(在最早版本的表达式中,就是这样做的)

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