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

Gofiber + Django模板递归渲染异常问题求助

递归Django模板渲染多层文件夹结构的稳定解决方案

问题背景

  • 使用Bootstrap折叠面板生成文件夹结构,1级深度渲染正常,但2级及以上深度无法正常工作
  • 服务运行在Docker容器中,根模板通过循环调用partials目录下的子模板,子模板需递归自身实现多层渲染
  • 初始用{% include "partials/subfolder_template.django" with folder=folder %}时服务无法启动;改为{% include "subfolder_template.django" with folder=folder %}后服务启动且递归有效,但容器重启后报错:failed to render: template department/media_view does not exist
  • 临时修改(删除子模板递归行再恢复)可临时支持N层深度,但容器重启后仅支持2层

稳定解决步骤

1. 修复变量名冲突(核心问题)

子模板中循环变量与传入的folder变量重名,导致递归时变量被覆盖,引发渲染异常。将循环变量改为subfolder,并替换所有内部引用:

修改后的partials/subfolder_template.django:

{% for subfolder in folder.Subfolders %}
    <div class="container-fluid w-100 h-100 text-center pt-3">
        <div class="card multi">
            <div class="card-header" role="tab" id="heading{{subfolder.Name}}">
            <h5 class="mb-0">
                <a class="r2_image_link collapsed" data-toggle="collapse" data-parent="#accordion" style="text-transform: uppercase;" href="#collapse{{subfolder.Name}}" aria-expanded="false" aria-controls="collapse{{subfolder.Name}}">
                    <i class="fa-solid fa-folder" style="color: #e4b91b;"></i> {{subfolder.Name}}
                </a>
            </h5>
            </div>
            <div id="collapse{{subfolder.Name}}" class="collapse" role="tabpanel" aria-labelledby="heading{{subfolder.Name}}">
            <div class="card-block">
                    <ul class="collapsible-list"> 
                        {% for image in subfolder.Images %}
                        <div class="d-flex justify-content-between align-items-center" style="padding-bottom: 10px; padding-top: 10px; border-bottom: 1px solid rgb(104, 104, 104);">
                            <img width="50px" src="https://{{Domain}}/{{image.URL}}">
                            <a class="r2_image_link copy-text" data-alt="https://{{Domain}}/{{image.URL}}">
                                <p style="padding-left: 30px;">{{subfolder.Name}}</p>
                            </a>
                            </div>
                        {% endfor %}

                        {% if subfolder.Subfolders %}
                            <div class="container-fluid w-100 h-100 text-center pt-3">
                                    <ul>
                                        {% include "partials/subfolder_template.django" with folder=subfolder %}
                                    </ul>
                            </div>
                        {% endif %}
                    </ul>
            </div>
            </div>
        </div>
    </div>
{% endfor %}

2. 确认模板目录配置

在Django的settings.py中,确保TEMPLATES配置包含partials所在的模板根目录:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates'],  # 假设partials目录在templates/partials下
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

3. 清理Docker缓存并重构服务

临时修改导致的缓存残留会引发重启后的异常,执行以下命令彻底清理:

docker-compose down
docker system prune -af
docker-compose up --build

4. 修正Bootstrap折叠面板ID格式

原模板中折叠面板ID包含/符号,会导致DOM选择器异常,统一去掉特殊字符,确保每个折叠面板的id、href、aria-controls属性完全对应,避免多层展开/折叠失效。

内容的提问来源于stack exchange,提问作者Liam Gomez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 14:04:55