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

Jinja模板中使用namespace仍无法保留循环变量数据的问题

解决Jinja模板中跨循环传递筛选数据的问题

问题根源

你当前代码的核心问题在于:遍历data时,只要item不匹配就将ns.temp重置为空。如果data中存在多个不匹配的item,之前找到的匹配数据会被覆盖清空,导致后续的choices循环无法拿到有效数据。

解决方案一:修正Namespace的使用逻辑

去掉else分支中重置ns.temp的操作,仅在找到匹配项时更新变量,确保已找到的有效数据不会被后续不匹配项覆盖:

{% for question in questions %}
    <div class="question-box">
        <div class="question-parent">
            <div class="question-text">
                <h3 id="{{ question.question_id }}">{{ question.question_text }}</h3>
            </div>
            <div class="question-answer-box" name="{{ question.question_id }}">
            {% set ns = namespace(temp = {}) %}
            {% for item in data %}  
                {% if item["question_instance_id"] == question.question_id %}
                    {% set ns.temp = item %}  
                {% endif %}
            {% endfor %} 
            {% for choice in question.choices %}
                {% if choice.choice_id == ns.temp.get("response_answer") %}
                    <label><input type="radio" value="{{ choice.choice_id }}" name="{{ question.question_id }}" checked />
                    {{ choice.choice_text }}
                    </label>
                    <br/> 
                {% else %} 
                    <label><input type="radio" value="{{ choice.choice_id }}" name="{{ question.question_id }}" />
                    {{ choice.choice_text }}
                    </label>
                    <br/> 
                {% endif %}
            {% endfor %}
            </div>
        </div>
    </div>    
{% endfor %}    

解决方案二:后端预处理数据(更优)

在后端将data转换为以question_instance_id为键的字典,避免在模板中循环遍历筛选,提升性能且代码更简洁:

后端示例(Python)

# 将列表转为字典,key为question_instance_id
data_dict = {item["question_instance_id"]: item for item in data}
# 将data_dict传入模板上下文

模板代码

{% for question in questions %}
    <div class="question-box">
        <div class="question-parent">
            <div class="question-text">
                <h3 id="{{ question.question_id }}">{{ question.question_text }}</h3>
            </div>
            <div class="question-answer-box" name="{{ question.question_id }}">
            {% set temp_item = data_dict.get(question.question_id, {}) %}
            {% for choice in question.choices %}
                {% if choice.choice_id == temp_item.get("response_answer") %}
                    <label><input type="radio" value="{{ choice.choice_id }}" name="{{ question.question_id }}" checked />
                    {{ choice.choice_text }}
                    </label>
                    <br/> 
                {% else %} 
                    <label><input type="radio" value="{{ choice.choice_id }}" name="{{ question.question_id }}" />
                    {{ choice.choice_text }}
                    </label>
                    <br/> 
                {% endif %}
            {% endfor %}
            </div>
        </div>
    </div>    
{% endfor %}    

额外提示

  • 使用.get()方法访问字典键(如ns.temp.get("response_answer")),可以避免当ns.temp为空时抛出KeyError异常。
  • 后端预处理数据的方式更适合数据量较大的场景,减少模板中的循环次数,提升渲染效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:02:50