如何让自定义Django模板标签支持'as'参数注入上下文变量
让自定义模板标签支持
as参数的简单方法 嘿,我明白你想让自己写的relative_url标签能像内置的{% url %}那样用as把结果存到上下文变量里的需求。其实不用去啃复杂的URLNode源码,Django已经给我们准备好了简单的方案!
核心解决方案:利用Django内置的标签装饰器支持赋值
你现在用的@register.simple_tag在Django 1.9及以上版本里,本身就支持as参数的赋值语法!也就是说,你几乎不用修改现有的标签代码,直接在模板里按你想要的方式用就行:
{% with params=request.GET.urlencode %} {% relative_url field value params as action_url %} {% endwith %} <form action="{{ action_url }}"> <!-- 表单内容 --> </form>
如果你的项目还在使用Django 1.9之前的版本(虽然不太推荐),只需要把装饰器换成@register.assignment_tag就可以了——这个装饰器就是专门用来支持赋值的标签,1.9之后才被整合进simple_tag里。
为什么不需要自定义Node类?
内置的{% url %}标签用自定义URLNode是因为它要处理URL命名解析、参数校验等复杂逻辑,但你的relative_url标签逻辑很直接:接收参数、处理字符串、返回拼接后的URL。simple_tag/assignment_tag已经帮我们封装了「将返回值存入上下文变量」的逻辑,完全不需要自己去实现Node的渲染逻辑。
验证一下你的代码
你的标签代码本身是没问题的,用as参数时,模板引擎会自动把标签返回的字符串赋值给action_url变量,而不是直接输出到页面上,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Kurt Peek
相关产品推荐
相关产品推荐

