объект сеанса доступа в формах WT

Я пытаюсь заполнить роли в зависимости от идентификатора организации, но кажется, что формы 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 поднять RuntimeError («работает вне контекста запроса») RuntimeError: работает вне контекста запроса


person beebek    schedule 22.09.2013    source источник
comment
Вы не можете наследовать от session вот так. Какова цель поля organization_id, если вы уже можете получить к нему доступ через переменную сеанса?   -  person Blender    schedule 22.09.2013
comment
В приложении зарегистрировано несколько организаций, и отдельная организация может создать свою собственную роль, что приведет к другому списку ролей для отдельной организации. И при создании пользователя я хочу, чтобы идентификатор организации отображал соответствующие роли для этой организации.   -  person beebek    schedule 22.09.2013


Ответы (2)


Как сказал блендер, вы не можете использовать сеанс таким образом. Единственный способ, который я могу придумать, - это использовать сеанс в представлениях и отправлять необходимые данные при рендеринге шаблона.

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()

Надеюсь, это поможет вам.

person rajpy    schedule 23.09.2013

Хитрость здесь заключается в том, чтобы установить выбор на основе логики в представлении.:

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(), вы можете изменить его по своему усмотрению.

Для справки см. SelectField from Dynamic Choices в Документы WTForms.

person Crast    schedule 23.09.2013