【问题标题】:WTForms SelectMultipleFields dynamic defaultsWTForms SelectMultipleFields 动态默认值
【发布时间】:2014-07-31 17:45:15
【问题描述】:

我正在使用带有 Flask 的 WTForms(不是 Flask-wtf)。 我正在使用动态设置选项的 SelectMultipleFields;

class MyForm(Form):
    country = SelectMultipleField("Country", option_widget=widgets.CheckboxInput(),
       widget=widgets.ListWidget(prefix_label=False))

正如我所说,选择是动态的,我查询数据库以获取新的国家,然后设置选择,类似于;

form = MyForm(request.form, obj=user) # obj = user's sqlalchemy object
form.country.choices = [(c.title(), c.title()) for c in get_distinct_countries()]

get_distinct_countries 在哪里查询数据库并返回一个包含国家/地区[('country a', 'country a'), ('country b', 'country b', (...)] 的列表

这一切都很好,但现在我想设置默认值,这也是动态的,所以我尝试了这个;

form = PersonalForm(request.form, obj=user)
form.country.choices = [(c.title(), c.title()) for c in get_distinct_countries()] # to fix
form.country.default = [(i.title(), i.title()) for i in get_user_country(userid)]

这是我的 get_countriesget_user_country 函数;

def get_user_country(id): # todo
    with session_scope() as session:
        countries = session.query(UserCountry).filter_by(user_id=id)
    return [c.country for c in countries.all()]

def get_distinct_countries(): # todo
    """Returns a list of all countries (without duplication)"""
    with session_scope() as session:
        countries = session.query(Country).distinct(Country.country).group_by(Country.country)
    return [i.country.capitalize() for i in countries.all()]

get_user_country 的输出类似于[('country a, 'country a'), (...)] 没用,我没有得到任何回溯,但是在检查表单字段时,没有设置为默认值。我怎样才能做到这一点?

注意,我传递了 obj=user,因为这是用户将重新编辑他的设置的表单,所以我希望数据在那里,显然我看到的一切都是正确的,除了国家/地区的数据。

谢谢。

【问题讨论】:

    标签: python flask wtforms


    【解决方案1】:

    我意识到这已经很晚了,但我在谷歌搜索同一问题时发现了这个页面。正如其他用户所指出的,要动态设置突出显示的字段,您必须设置 form.field.data(不是 form.field.default)。所需的选择必须包含在一个列表中(即使它是一个单一的选择)。仅使用您为选择提供的 (value, label) 元组的“值”成员。在您的情况下,代码将是:

    form.country.data = [i.title() for i in get_user_country(userid)]
    

    这行不通:

    form.country.data = [(i.title(), i.title()) for i in get_user_country(userid)]
    

    如果你想要一个单一的默认值,这也行不通:

    form.country.data = "some value"
    

    但这会:

    form.country.data = ["some value"]
    

    【讨论】:

      【解决方案2】:

      当谈到默认值时,我发现 WTForms 很烦人,因为它不像您期望的那样工作。您可以通过default 参数设置全局默认值,但不能按会话设置。

      对于简单的字段,可以在视图中设置值:

      @app.route('/some_route')
      def flask_route():
      
          form = YourFormHere(obj=obj)
      
          form.some_field.data = "default data here"
      
          render_template('template.tmpl', form=form)
      

      我不记得我是否为 SelectMultipleFields 做过这个 - 我在代码库中进行了快速搜索,但没有任何结果。希望这对你有用。

      【讨论】:

      • 我也试过了,没成功:(,什么也没发生,和上面一样:(
      【解决方案3】:

      您是否尝试过将default 值设置为不是元组just the index

      form.country.default = [i.title() for i in get_user_country(userid)]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-04
        • 2012-04-20
        • 1970-01-01
        • 2021-04-07
        相关资源
        最近更新 更多