没有项目描述
django-template-block-args的Python项目详细描述
django_template_block_args
动机
此工具使标记的“组件化”更容易。具体来说,它使创建模板标记更容易,这些标记将blocks作为参数接收。
我们都编写了这样的对话框标记:
<div class="dialog dialog-success"> <div class="dialog-success-icon"></div> <div class="dialog-content"> Content goes here! </div> </div>
如果您不止一次地编写了此文档,则可能会尝试创建模板标记
# templatetags.py#...@register.inclusion_tag('alert.html')defdialog(type,content):return{"type":type,"content":content,}
<div class="dialog dialog-{{type}}> <div class="dialog-{{type}}-icon"> </div> <div class="dialog-content"> {{content}} </div></div>
这样您就可以简单地编写
{%dialog'success''Content goes here!'%}在你的Django模板中,使它更具D.R.Y.这里的问题是你可以传递什么内容的灵活性。如果您想在对话框中添加标记,那么您将不得不在任何地方重复标记或在python字符串中组装标记并在其上调用
mark_safe
。用法
django_template_block_args通过允许您将整个模板块传递给一个助手来解决问题。它提供了两个功能,最简单的一个涵盖了大多数用例。它的行为非常类似于django的内置register.inclusion_tag
。你可以把它们看作是django内置插件的扩展inclusion_tag
register_composed_template(register, template_name, [takes_context=False])
在上面的对话框示例中,我们可以将块作为参数传递:
# templatetags.pyfromdjango_template_block_argsimportregister_composed_template#...@register_composed_template(register,'alert.html')defdialog(type):return{"type":type,}
{%withvar=True%}{%dialog"success"%} Content goes here! No need to escape <strong> HTML </strong>, you can use template tags, filters and even access the surrounding template's context. {%ifvar%}{%dialog"success"%} And recursion! {%enddialog%}{%endif%}{%enddialog%}
注意,我们没有像第一个示例中那样传递或接收context
参数。这是因为子块参数将作为content
自动合并到目标模板的上下文中。请确保不要调用任何上下文变量内容,因为它们将被此默认值覆盖。
register_composed_template_with_blockargs(register, template_name, block_names, [takes_context=False])
register_composed_template
只允许传递一个块,另一个函数允许传递multiple块并命名它们。
当您希望用多段文本填充模板时,这将变得非常有用。例如,我们可能有一个卡模板组件,其外观如下:
<div class="card card-{{type}}">{%ifcard_header%} <div class="card-header">{{card_header}} </div>{%endif%} <div class="card-body">{{card_body}} </div></div>
为了将块传递到card_header
和card_footer
,我们的python和consumer模板应该如下所示:
# templatetags.pyfromdjango_template_block_argsimportregister_composed_template#...@register_composed_template(register,'alert.html',block_names=("card_header","card_body"))defcard(type):# note that block-args automatically get passed to the templatereturn{"type":type}
{%card"success"%}{%blockarg'card_body'%} I'm a card-body!{%endblockarg%}{%blockarg'card_header'%} I'm a card-header!{%endblockarg%}{%enddialog%}
与第一个示例一样,页眉和页脚块也可以包含标记、模板标记和访问周围的上下文。
安装
pip install django-template-block-args
这个包由两个简单的函数组成,它们的依赖项是内置的django。所有您需要的是将这些函数导入到现有的TimePtAGS模块中。无需更改django设置模块中的任何内容。
开发
- 回购协议包含包的模块和一个示例django项目
贡献/下一步
- 编写测试
- 替换上述文档的简短示例列表
- 更好的错误信号
- 确保人们避免在自定义标记与其块参数之间使用模板内容
- 不应在函数中使用块名或内容