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

Jinja2 'sorted'未定义错误排查:Quizlet类Web应用问题

解决Jinja2中sorted/enumerate未定义的错误

问题根源

Jinja2模板引擎默认不会将Python的内置函数(如sorted、enumerate)暴露到模板环境中,所以你在模板里直接调用这些函数会触发UndefinedError——这和你在Python代码里是否导入无关,模板运行在独立的Jinja环境中。

解决方案(推荐:后端处理数据)

模板应专注于渲染逻辑,数据排序、索引处理这类操作放在Python后端完成更清晰,也避免依赖Jinja环境的自定义配置:

修改Python后端代码

在构建question_answers字典时,直接对每个问题的答案列表进行排序,把处理好的数据传给模板:

@app.route('/')
def exam():
    # 无需全局变量声明,直接初始化局部变量即可
    numOfIncorrectQuestions = 0
    numOfCorrectQuestions = 0
    question_answers = {}

    cursor.execute('SELECT question.question, answer.answer, answer.isCorrect FROM question INNER JOIN answer ON question.questionID = answer.questionID ORDER BY RANDOM()')

    for row in cursor:
        question_text, answer_text, is_correct = row
        # 将答案添加到对应问题的列表
        question_answers.setdefault(question_text, []).append((answer_text, is_correct))
    
    # 对每个问题的答案列表排序(可根据需求自定义排序key,比如按answer_text排序)
    for q_text in question_answers:
        question_answers[q_text] = sorted(question_answers[q_text])

    return render_template(
        'exam.html', 
        numOfIncorrectQuestions=numOfIncorrectQuestions, 
        numOfCorrectQuestions=numOfCorrectQuestions,
        question_answers=question_answers
    )

修改HTML模板代码

利用Jinja自带的loop.index0(从0开始的循环索引)替代enumerate,无需再调用sorted:

{% for question_text, answer_list in question_answers.items() %}
    <h2>{{ question_text }}</h2>
    <form id="question_{{ loop.index }}" method="POST">
        {% for answer_text, is_correct in answer_list %}
            {% set idx = loop.index0 %}
            <label>
                <input type="radio" name="answer" value="{{ chr(ord('a') + idx) }}" />
                {{ chr(ord('a') + idx) }}) {{ answer_text }}
            </label><br />
            <input type="hidden" name="answer_list[]" value="{{ answer_text }}" />
            <input type="hidden" name="is_correct_list[]" value="{{ is_correct }}" />
        {% endfor %}
    </form>
{% endfor %}

备选方案:注册Jinja全局函数

如果你需要在模板中直接使用Python内置函数,可以将它们注册到Flask的Jinja环境中:

from flask import Flask

app = Flask(__name__)
# 将sorted和enumerate注册为Jinja全局函数
app.jinja_env.globals.update(
    sorted=sorted,
    enumerate=enumerate
)

注册后你原来的模板代码就能正常运行,但这种方式会让模板和Python环境耦合度更高,不推荐在复杂项目中使用。

内容的提问来源于stack exchange,提问作者René Guido Steg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 22:24:55