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
相关产品推荐
相关产品推荐

