Search code examples
pythonsessionflaskwtforms

What is the correct way to populate fields from database or session data?


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?


Solution

  • 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.