【问题标题】:Why is the StringField always None?为什么 StringField 总是无?
【发布时间】:2019-09-24 10:41:30
【问题描述】:

我正在尝试使用 Flask、WTForms 和通过 flask-Bootstrap 提供的宏来读取表单。这在某些情况下有效,而在其他情况下(看似相似的情况)则无效。当我检查特定 StringField 的内容时,它总是评估为 None,未能通过 InputRequired() 验证。

forms.py:

from wtforms import Form, validators, \
                    StringField, PasswordField, SubmitField, \
                    SelectField, RadioField
from wtforms.fields.html5 import DateField
from wtforms.validators import ValidationError, InputRequired, NoneOf, \
                               EqualTo, Length, Optional

class TestForm(Form):
    name = StringField('Name', [validators.InputRequired(message='Please enter name!')])
    date = DateField('Date', format='%Y-%m-%d') #, default=date.today())
    address = StringField('Address')
    submit = SubmitField('Add')

test.py:

from flask import render_template, redirect, request
from flask_security import login_required
from application.routes import routes
from application.forms import TestForm

@routes.route('/test', methods=['POST', 'GET'])
@login_required
def test():
    form = TestForm()
    print(form.name.data)
    if request.method == 'POST' and form.validate():
        print("validated")
        return redirect("/")
    return render_template('test.html', title="Asset Manager", form=form)

test.html:

{% extends 'layout.html' %}

{% import "bootstrap/wtf.html" as wtf %}
{% block content %}
  <div class="container-fluid">
    <h3><u>Test:</u></h3>
    <br>
    <div class="container-fluid col-md-3">
      <form action="" method="POST" class="form" role="form" onsubmit="/">
        <div class="row">
          <div class="col-md-12">
            {{ wtf.form_field(form.name, form_type="inline", placeholder="Name") }}
          </div>
        </div>
        <div class="row">
          <div class="col-md-5">
            {{ wtf.form_field(form.date) }}
          </div>
        </div>
        <div class="row">
          <div class="col-md-12">
            {{ wtf.form_field(form.address) }}
          </div>
        </div>
        {{ wtf.form_field(form.submit, class="btn btn-primary") }}
      </form>
      {% for message in get_flashed_messages() %}
      <div class="alert alert-warning">
        <button type="button" class="close" data-dismiss="alert">&times;</button>
        {{ message }}
      </div>
    </div>
    {% endfor %}
  </div>
{% endblock %}

这总是输出 None,因此即使我输入名称并按下 Add 按钮,也不会通过验证检查。 我尝试创建一个最小的示例(仍然存在相同的问题),但我遗漏了应用程序的大部分内容,因此如果您需要更多信息 - 请告诉我,我很乐意提供。

【问题讨论】:

  • 有些东西,TestFrom 和 AssetManagerForm 是不同的东西?你在哪里使用传入的表单来处理任何事情,因为现在它初始化了一个新的测试表单,然后你尝试验证?尝试将 form.validate() 更改为 request.form.validate()
  • 是的,我打算在任何地方替换 AssetManager 以使整个示例看起来更通用(现在编辑它)。但是,您的问题为我指明了正确的方向。我忘了在我的表单构造函数中添加 request.form 。使用 form = TestForm(request.form) 解决了。

标签: python flask wtforms flask-bootstrap


【解决方案1】:

感谢 Marc,我找到了遗漏的地方。实例化表单时,我需要将请求作为参数传递。 所以这条线

form = TestForm()

需要改成

form = TestForm(request.form)

使应用程序工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多