django 引用html页面,django 如何使 include 标签引用的子页面中的 block 生效?

文档结构:

base.html

{% include tools.html %}

tools.html

{% block ... %}

{% block ... %}

page.html

{% extends base.html %}

其中 ——

tools.html 中含有一些 {% block %} 标签;

tools.html 被 {% include %} 标签引入到了 base.html 中;

base.html 被 {% extends %} 标签引入到了 page.html 中;

想要实现的效果:

在 page.html 中引用 tools.html 中的标签,进行改写。

遇到的问题:

page.html 能引用 tools.html 中的普通 html 代码,但是无法对 {% block %} 标签进行改写。

查到的资料:

Stack Overflow 上这个问题的第二个答案引用了一段 django 文档中的话:

The include tag should be considered as an implementation of "render this subtemplate and include the HTML", not as "parse this subtemplate and include its contents as if it were part of the parent". This means that there is no shared state between included templates -- each include is a completely independent rendering process.

大意是说 tool.html 在被 {% include %} 引入进 base.html 时就已经被渲染成 html 文本了?

那这样的话,有没有比较方便的替代方案?

补充说明:

tools.html 中的内容除了 base.html,还有其它地方会用到,所以就被单独写在一个文件里;

但是在其它地方引用的时候会有一点点细微的改动,所以又在其中加入了 {% block %} 标签。

有没有一种比较“优雅”的方式既能保障 tools.html 能被复用,又能比较方便地在复用时进行微调?

已尝试方案:

自定义标签,将 tools.html 中的内容作为文本直接添加到 base.html 中。

# 注册自定义标签

@register.simple_tag

def render_file_as_template(file):

file_dir = os.path.join(settings.STATIC_ROOT, file)

with open(file_dir, encoding='utf8') as f:

return f.read()

结果 HTML 标签被转义,页面直接出现了一堆源码;

使用 {% autoescape off %} 标签取消自动转义后,HTML 标签能正常显示了,但是 {% block %} 标签仍然被转义,直接被当做字符串处理——

1460000011187902

(如图: {% block %} 标签被当做字符串直接出现在源码中)

不知道有没有办法,使得上图中的 {% block %} 标签得以渲染,并且能够被 page.html 引用后改写?

考虑过使用包含标签 Inclusion tags,通过设定不同的参数来对 tools.html 进行微调,但是感觉这个方案会使模板、模型、视图混杂在一起,与 django MTV 的架构理念不太相符。不知道是不是我对 Inclusion tags 的理解有误?

替代方案

如何对被 {% include %} 标签引入的文件中的 {% block %} 覆盖重写,仍然没有找到答案。不过,我找到了一个可以实现类似效果的替代方案——

{% block tools %}

{% include 'tools.html' %}

{% endblock %}

...

{{ some_code_diff|default:'' }}

...

{% extends 'base.html' %}

{% block tools%}

{% include 'tools.html' with some_code_diff='plan1' %}

{% endblock %}

{% extends 'base.html' %}

{% block tools%}

{% include 'tools.html' with some_code_diff='plan2' %}

{% endblock %}

将 tools.html 中有改动的部分设定为参数变量,并使用 {% include %} 标签放置于 base.html 中的 {% block %} 标签内,即可在 page.html 对 {% block %} 中的 {% include %} 进行重写,根据不同的页面设置不同的变量,同样能达到微调的作用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值