【问题标题】:accession session object in WT formsWT 形式的加入会话对象
【发布时间】:2013-09-22 01:37:48
【问题描述】:

我正在尝试根据组织 ID 填充角色,但似乎 WT 表单不支持会话

view.py

@users.route('/', methods=['GET', 'POST'])
@users.route('/manage', methods=['GET', 'POST'])
@login_required
def manage_users():
    form = User_Form()
    return render_template('account/manage_users.html', form=form)

user_form.py

from flask import session
from wtforms import Form, SelectField, TextField, PasswordField, validators

class User_Form(Form, session):
    username = TextField('Username', [validators.Length(min=4, max=25)])
    password = PasswordField('New Password', [
        validators.Required(),
        validators.EqualTo('confirm', message='Passwords must match')
    ])
    confirm = PasswordField(u'Repeat Password')
    email = TextField(u'Email', [validators.Length(min=6, max=35)])
    active = SelectField(u'Active', choices=[('1', 'True'), ('0', 'False')])

    organization_id = session['user_id']
    #role = "list roles according to organization_id"

文件“C:\Users\dell\Envs\surveyApp\lib\site-packages\flask\globals.py”,第 20 行,在 _lookup_req_ob 项目 raise RuntimeError('在请求上下文之外工作') RuntimeError:在请求上下文之外工作

【问题讨论】:

  • 你不能像这样从session继承。如果您已经可以通过会话变量访问 organization_id 字段,那么它的用途是什么?
  • 该应用程序注册了多个组织,各个组织可以创建自己的角色,从而为各个组织创建不同的角色列表。在创建用户时,我希望组织 ID 列出该组织的相应角色。

标签: flask wtforms flask-wtforms


【解决方案1】:

正如搅拌机所说,您不能以这种方式使用会话。我能想到的唯一方法是在视图中使用会话并在渲染模板时发送必要的数据。

view.py

@users.route('/', methods=['GET', 'POST'])
@users.route('/manage', methods=['GET', 'POST'])
@login_required
def manage_users():
    form = User_Form()
    form.organization_id.data = session['user_id']
    return render_template('account/manage_users.html', form=form)

并在表单中将 'organization_id' 标记为 TextField:

class User_Form(Form, session):
    # Other fields
    organization_id = TextField()

希望对你有所帮助。

【讨论】:

    【解决方案2】:

    这里的技巧是根据视图中的逻辑设置选项。:

    def manage_users():
        form = User_Form()
        if session['user_id'] == 1:
            form.role.choices = [('Role1', 'Label1'), ('Role2', 'Label2')]
        else:
            form.role.choices = [...]
        if form.validate():
            ...
    
        return render_template('account/manage_users.html', form=form)
    

    只要在调用validate() 之前设置了选项,那么您就可以按照您认为合适的方式更改它们。

    有关参考,请参阅 WTForms 文档中的 SelectField from Dynamic Choices

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 2018-01-08
      • 2018-12-05
      • 2021-10-06
      • 1970-01-01
      • 2014-08-09
      • 1970-01-01
      相关资源
      最近更新 更多