【问题标题】:Prepopulate Flask-WTForm IntegerField预填充 Flask-WTForm IntegerField
【发布时间】:2014-10-13 15:12:44
【问题描述】:

简单形式:

class AdjustPWMForm(Form):
    dutyCycle = IntegerField('dutycycle')
    #dutyCycle = IntegerField('dutycycle', default=44)

查看功能:

 def adjust():
    user = g.user
    form = AdjustPWMForm()
    form.dutyCycle.data = 55
    if form.validate_on_submit():
        dutyCycle = form.dutyCycle.data
        print('result %s', dutyCycle)
        return redirect(url_for('statusPage'))

    return render_template('adjust.html', title='Adjust PWM', user=user, form=form)

提交表单时,无论输入什么,结果始终为 55。如果我注释掉第 55 行,并取消注释 default=44 的行,表单可以正常工作,但我确实需要能够设置预填充值(它将从数据库中检索)。

似乎我遗漏了一些非常明显的东西,但我四处寻找却无法弄清楚。

我发现wtforms 中的 change_username 部分很有用,这导致我:

def adjust():
    user = g.user
    form = AdjustPWMForm(dutyCycle=55)
    if form.validate_on_submit():
        dutyCycle = form.dutyCycle.data
        return redirect(url_for('statusPage'))

    return render_template('adjust.html', title='Adjust PWM', user=user, form=form)

这是实现这一目标的最佳方式吗?

【问题讨论】:

    标签: python flask wtforms flask-wtforms


    【解决方案1】:

    您可以在 GET 请求中设置默认值

    def adjust():
        user = g.user
        form = AdjustPWMForm()
        if request.method == 'GET':
            form.dutyCycle.data = 55
        if form.validate_on_submit():
            dutyCycle = form.dutyCycle.data
            print('result %s', dutyCycle)
            return redirect(url_for('statusPage'))
        return render_template('adjust.html', title='Adjust PWM', user=user, form=form)
    

    或者在类中设置一个默认值

    class AdjustPWMForm(Form):
        dutyCycle = IntegerField('dutycycle', default=55)
    

    如果默认值适用于此表单的所有实例,我将在类定义中设置默认值。如果我需要基于其他查找设置字段的默认值,我会使用form = AdjustPWMForm(dutyCycle=55) 方式设置它。

    【讨论】:

    • 谢谢,您建议仅在 GET 上设置值,效果很好。顺便说一句,小错字...应该是 request.method。
    【解决方案2】:

    我通常在“POST”方法之后预先填充表单,而不指定请求方法(GET 或 POST)。 由于我没有在 POST 方法之前进行预填充,因此预填充不会影响 POST 方法附带的任何新值;而且由于我没有指定任何“GET”或“POST”方法,如果 POST 方法失败,它无论如何都会预先填充。

    def foo():
        form = MyForm(request.form)
    
        if request.method == 'POST' and form.validate:
            my_code
    
        form.dutyCycle.data = 55
    
        render_template('my_template', form=form)
    

    【讨论】:

    • 我刚刚注意到你的评论这篇文章已经有 2 年的历史了。很抱歉给您带来不便。
    • 抱歉,它在审核队列中弹出。现在看起来不错!谢谢:)
    【解决方案3】:

    而不是

    form.dutyCycle.data = 55
    

    使用

    form.dutyCycle.process_data(55)
    

    data 属性在验证后保存用户放置的数据。您通过分配给data 来覆盖用户输入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-29
      • 2021-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多