问题
I'm storing some variables in the session when the user logs in, to use later to populate a field.
from flask_wtf import Form
from wtforms import SelectField
from flask import session
class InstitutionForm(Form):
city = session['city']
city_tuples = [(x, x) for x in city]
organisation = SelectField(
'organisation',
choices=city_tuples
)
class Institution(View):
methods = ['POST']
def dispatch_request(self):
form = InstitutionForm()
return render_template(
'form/institution.html',
form=form)
When I run the app I get the error 'working outside of request context'. What is the correct way to populate this field from the session data?
回答1:
Code in a class definition is executed at import time, not when the class is instantiated. You need to move the access to session
to the __init__
method so that it will be accessed when creating a form in a view function.
class Institution(Form):
organization = SelectField()
def __init__(self, *args, **kwargs):
self.organization.kwargs['choices'] = [(x, x) for x in session.get('city', ('not set',))]
super().__init__(*args, **kwargs)
This applies to anything that needs an application or request context, such as a database query, not just the session
.
来源:https://stackoverflow.com/questions/28194593/what-is-the-correct-way-to-populate-select-choices-from-session-data