You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django模板的{% include %}标签中使用参数动态引入模板?

Django动态引入模板的正确实现方式

嘿,我来帮你搞定这个动态引入模板的问题!你之前的写法踩了Django模板语法的小坑——模板里不能直接把字符串和变量像'cryptography/'{{page}}'html'这样混合拼接,得用正确的语法或者把逻辑移到视图层处理。下面给你两种靠谱的实现方案:

方法一:在模板中使用字符串拼接过滤器

Django模板自带add过滤器可以用来拼接字符串,用它把目录名、page变量和后缀拼起来就行,写法如下:

{% if type == "Cryptography" %}
    {% include 'Cryptography/'|add:page|add:'.html' %}
{% elif type == "Password Cracking" %}
    {% include 'PasswordCracking/'|add:page|add:'.html' %}
{% endif %}

⚠️ 注意点:

  • 确保page变量是字符串类型(视图传入数字也没关系,Django渲染时会自动转成字符串)
  • 目录名要和实际模板目录的大小写完全一致,比如你写的Cryptography,要确保项目里的模板目录也是这个大小写,不然会找不到模板文件

方法二:在视图层提前拼接完整模板路径

把路径拼接的逻辑放到视图里,模板只需要直接引入生成好的路径,这样模板更简洁,也更容易调试和做安全校验:

视图函数修改:

from django.shortcuts import render
from django.http import Http404

def lessons(request, foo, page):
    # 先验证page合法性,防止恶意路径注入
    allowed_pages = {"1", "2", "3"}
    if page not in allowed_pages:
        raise Http404("Invalid page number")
    
    # 根据type参数拼接模板路径
    if foo == "Cryptography":
        template_path = f"Cryptography/{page}.html"
    elif foo == "Password Cracking":
        template_path = f"PasswordCracking/{page}.html"
    else:
        # 处理未匹配的type,比如返回默认模板或者404
        template_path = "default_lesson.html"
    
    return render(request, 'lessons.html', {'template_path': template_path})

模板修改:

{% include template_path %}

这种方式的优势:

  • 模板逻辑极简,不用写复杂的if判断
  • 能在视图里做参数校验,比如限制page只能是1/2/3,避免恶意用户传入../这类路径导致目录遍历漏洞,安全性更高

额外提醒

  • 确保模板目录结构正确:Cryptography和PasswordCracking要放在Django配置的TEMPLATES目录下,比如project/templates/Cryptography/1.html
  • 不管用哪种方法,都要记得校验page参数的合法性,别给安全漏洞留机会

内容的提问来源于stack exchange,提问作者Swaroop Maddu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:06:58