Python 调用时,通过Jinja模板变量在烧瓶中排序

Python 调用时,通过Jinja模板变量在烧瓶中排序,python,mongodb,sorting,flask,jinja2,Python,Mongodb,Sorting,Flask,Jinja2,我有一个HTML下拉表单不起作用,所以我只是将它改为按钮进行测试(我对Flask和python一般来说都是新手,所以我正在试验) 我试图让用户选择按添加的时间、名称等对帖子进行排序。目前我只是在尝试这三种方式,它们是按钮形式(当我确定如何排序时,将在下拉列表中): 我已经在提问了,我已经通过以下方式正确显示了所有问题: @app.route("/get_questions") def get_questions(): questions = mongo.db.ques

我有一个HTML下拉表单不起作用,所以我只是将它改为按钮进行测试(我对Flask和python一般来说都是新手,所以我正在试验)

我试图让用户选择按添加的时间、名称等对帖子进行排序。目前我只是在尝试这三种方式,它们是按钮形式(当我确定如何排序时,将在下拉列表中):

我已经在提问了,我已经通过以下方式正确显示了所有问题:

@app.route("/get_questions")
def get_questions():
    questions = mongo.db.questions.find().sort("added_on", -1)
    return render_template("questions.html", questions=questions)
但是,当我尝试使用按钮调用排序时,出现以下错误:

UnboundLocalError: local variable 'questions' referenced before assignment
它调用它到第40行,这是:
在filters函数中返回render_模板(“questions.html”,questions=questions)

那么,我做错了什么?我需要做什么才能让用户排序选项进入下拉列表,使其正常工作


非常感谢:)

HTML表单没有
名称属性,因此您可以删除该属性。您可能要做的是在按钮中添加一个
名称
和一个
属性,因为提交表单时会将名称-值对发送到服务器

稍后,当您确认代码正常工作时,您可以将按钮调回下拉菜单
select
input,就像您最初计划的那样。对于按钮,它类似于:


最新的
最老的
名称
对于基于
选择
的下拉列表,它类似于:


最新的
最老的
按姓名
应用过滤器
问题的第二部分是
UnboundLocalError
,这是因为检查
sort
变量的所有测试都不会产生真实值,因此
问题
变量未定义,换句话说,未绑定。例如,如果请求中没有提供
sort
的默认值,则可以使用另一个
if
结构,使用
if
elif
else
,将
else
作为默认值。比如:

def过滤器():
sort=request.form.get(“sort”)
如果排序==“最早”:
questions=mongo.db.questions.find().sort(“已添加”,1)
elif排序==“最新”:
questions=mongo.db.questions.find().sort(“添加了”,-1)
elif排序==“名称”:
questions=mondo.db.questions.find().sort(“创建人”,1)
其他:
#如果'sort'不是上述任何一项,则默认显示最新的问题
questions=mongo.db.questions.find().sort(“添加了”,-1)
返回呈现模板(“questions.html”,questions=questions)
编辑 我关于
UnboundLocalError
的回答仍然是一样的,但当我重新阅读你的问题时,我意识到有一种更干净的方法可以做到这一点。过滤器应该由查询字符串参数处理,而不是由表单数据处理。使用查询字符串参数执行此操作意味着URL将与应用的筛选器一起共享

一般的想法是,单一路由处理显示问题以及处理过滤器的应用。您可以尝试以下方法:

@app.route(“/questions”)
定义问题():
sort=request.args.get(“sort”)
如果排序==“最早”:
questions=mongo.db.questions.find().sort(“已添加”,1)
elif排序==“最新”:
questions=mongo.db.questions.find().sort(“添加了”,-1)
elif排序==“名称”:
questions=mondo.db.questions.find().sort(“创建人”,1)
其他:
#如果'sort'不是上述任何一项,则默认显示最新的问题
questions=mongo.db.questions.find().sort(“添加了”,-1)
返回呈现模板(“questions.html”,questions=questions)
过滤器按钮应该是这样的。提交for时,过滤器将作为查询参数添加到URL中


最新的
最老的
名称

HTML表单没有
名称属性,因此您可以删除该属性。您可能要做的是在按钮中添加一个
名称
和一个
属性,因为提交表单时会将名称-值对发送到服务器

稍后,当您确认代码正常工作时,您可以将按钮调回下拉菜单
select
input,就像您最初计划的那样。对于按钮,它类似于:


最新的
最老的
名称
对于基于
选择
的下拉列表,它类似于:


最新的
最老的
按姓名
应用过滤器
问题的第二部分是
UnboundLocalError
,这是因为检查
sort
变量的所有测试都不会产生真实值,因此
问题
变量未定义,换句话说,未绑定。例如,如果请求中没有提供
sort
的默认值,则可以使用另一个
if
结构,使用
if
elif
else
,将
else
作为默认值。比如:

def过滤器():
sort=request.form.get(“sort”)
如果排序==“最早”:
questions=mongo.db.questions.find().sort(“已添加”,1)
elif排序==“最新”:
questions=mongo.db.questions.find().sort(“添加了”,-1)
elif排序==“名称”:
questions=mondo.db.questions.find().sort(“创建人”,1)
其他:
#如果'sort'不是上述任何一项,则默认显示最新的问题
questions=mongo.db.questions.find().sort(“添加了”,-1)
返回呈现模板(“questions.html”,questions=questions)
编辑 我关于
UnboundLocalError
的回答仍然是一样的,但当我重新阅读你的问题时,我意识到有一种更干净的方法可以做到这一点。过滤器可能由查询处理
@app.route("/get_questions")
def get_questions():
    questions = mongo.db.questions.find().sort("added_on", -1)
    return render_template("questions.html", questions=questions)
UnboundLocalError: local variable 'questions' referenced before assignment