wtforms中的SelectField结合sqlalchemy刷新机制是什么样的

lauriehjb
  • 5
新手上路,请多包涵

Flask写了两个页面,第一个是用户增加,第二个是获取数据库中的用户列表来修改信息。用户信息修改中用到了wtforms的SelectField控件,choices参数为调用数据库查询函数返回的字典。现在我发现当我增加完毕用户马上去维护信息时,用户列表并没有更新,也就是说SelectField并不是每次打开页面去查询列表。导致没办法对刚刚增加的用户进行修改。

路由函数:

@app.route('/main/userAlloc/userAllocManage', methods=['GET', 'POST'])
def userAllocManage():
    from form import UserAllocForm
    from Odb_cx import add_user_func
    form = UserAllocForm()
    if form.validate_on_submit():
        login_name = form.login_name.data
        alloc_list = form.alloc_list.data
        print('调用用户权限入库函数')
        message = add_user_func(login_name, alloc_list)
        print(message)
        flash(message)
    return render_template('userAllocManage.html', Form=form)

form:

class UserAllocForm(Form):
    from Odb_cx import func_query, user_query
    login_name = SelectField('登录名称(手机号码):', choices=user_query())
    alloc_list = SelectMultipleField('权限列表(可多选)', choices=func_query())
    submit = SubmitField('提交')

列表查询函数:

def user_query():
    try:
        t = engine.execute("select a.sys_user_id,a.sys_user_name from sys_user a")
        user_dict = []
        for i in t:
            user_dict.append((str(i[0]), i[1]))
        return user_dict
    except BaseException:
        return '用户列表获取异常!'

现在希望每次请求/main/userAlloc/userAllocManage时从数据库获取最近的列表信息来初始化SelectField,求助各位如何实现

回复
阅读 4.7k
3 个回答

首先我建议你好好读读我写的这篇文章。
基于 flask 的 CRUD 操作

如果想要实现你的需求,你可以变通一下,把 choices 参数,从 form 类中赋值,放置到 view.py 视图函数的后一部分赋值。

但是这样的话,感觉不优雅,你还是好好看看文章吧。

lauriehjb
  • 5
新手上路,请多包涵

感谢楼上给予我的意见,文章已拜读,蛮有收获。同时自己这个问题得到了解决。
首先贴上修改后的路由函数:

@app.route('/main/userAlloc/userAllocManage', methods=['GET', 'POST'])
def userAllocManage():
    from form import UserAllocForm
    from Odb_cx import add_user_func,user_query,func_query
    form = UserAllocForm()
    # 每次刷新列表
    form.login_name.choices=user_query()
    form.alloc_list.choices=func_query()
    print('请求:为用户赋权')
    if form.validate_on_submit():
        login_name = form.login_name.data
        alloc_list = form.alloc_list.data
        print('调用用户权限入库函数')
        message = add_user_func(login_name, alloc_list)
        print(message)
        flash(message)
    return render_template('userAllocManage.html', Form=form)

我的理解是这样的:当实例化UserAllocForm类时,程序会调用类中控件列表查询函数。而再次调用此页面时,由于这个类已经实例化了,所以只是复用,并不会再次请求列表。所以在路由函数中加上每次请求为控件的choice参数赋值即可(form.login_name.choices=user_query())。

风清扬
  • 2
新手上路,请多包涵

双簧演得不错

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏