我有一个 Django 网站,其中包含许多页面,所有页面都有自己独特的内容和标记(而不是动态填充数据的单个模板)。这些页面的模板源自一个通用的“工具”模板,而后者又源自一个“基础”模板。每个页面还有一个 JS 文件,用于为该页面编写脚本。每页数据分布在 3 或 4 个位置:
- 模板
- 页面脚本(可能还有其他特定于页面的静态)
- 一个中央“工具注册表”,其中包含工具名称、描述和类别等内容
- 对于某些工具,一组模板标签来执行特定于该页面的一些 HTML 构造(例如,要呈现在表格中的数据)。
然而,尽管每个页面都有独特的布局和内容,我仍然希望能够在页面之间共享常用的参数化 HTML“片段”。例如,一个页面有一个带有下拉按钮的输入,使用 Bootstrap,如下所示:
<div class="input-group">
<span class="input-group-btn">
<a class="btn btn-default dropdown-toggle" data-toggle="dropdown" href="#">
Common baudrates
<span class="caret"></span>
</a>
<ul class="dropdown-menu pull-right" id="common-baudrate-list">
<li><a href='#'>9600</a></li>
<li><a href='#'>115200</a></li>
</ul>
</span>
<input class="form-control" type="text" id="baudrate-input" val="115200">
</div>
我想制作一个可重用的参数化函数/模板/标签,它允许我放入这样的结构,例如“组 ID”、“条目列表”、“左/右按钮位置”、“默认值”价值”。
到目前为止,我看到的方法是:
- 作为一个模板,它的语法相当有限,并且很难做像这样的条目列表之类的事情:
['Entry 1', 'Entry 2']
- 作为模板,通过视图将数据传递到上下文中(并不真正吸引人,因为我会将页面内容传播得更多)。
- 作为模板标签,将 HTML 构建为一个讨厌的大字符串
- 作为使用像 lxml 这样的 XML 库的模板标签,这是一种非常灵活的方法,但存在语法冗长、过于复杂的问题,而且我仍然可以从模板中获取数据到标签中!
这些似乎都不是一种简洁、可重用和松散耦合的方式来处理这个问题(例如,如果我将来改用 Bootstrap 4,我可能需要重新编写这些组件,我宁愿不得不只做一次)。拥有这样的组件库也将使未来的页面更容易构建。有没有一种规范的“正确”方式来做到这一点,或者甚至是一个常用的成语?
编辑以显示解决方案实施
使用 Wolph 在下面回答的包含标签,我避免使用像这样的笨重结构
{% with [1,2,3] as items %}
{% my_tag items.split %}
{% endwith %}
如下:
@register.inclusion_tag('components/this_component.html')
def input_with_dropdown(dropdown_title, dropdown_items, default_value, group_id, button_left, *args, **kwargs):
split_char = kwargs['split_char'] if 'split_char' in kwargs else ' '
return {
'dropdown_items': dropdown_items.split(split_char),
'dropdown_title': dropdown_title,
'group_id': group_id,
'default_value' : default_value,
'button_left': button_left
}
然后像这样传入变量:
{% input_with_dropdown 'Common baudrates' '9600 48000 115200' 115200 'baudrate-input' 0 %}