【问题标题】:Flask - WTForm - Get Form Data as NoneType as opposed to StringFlask - WTForm - 将表单数据获取为 NoneType 而不是 String
【发布时间】:2016-03-08 18:09:35
【问题描述】:

为了解决这个问题,我已经在互联网上搜索了一段时间。

我正在做一个概念验证,一个简单的输入输出数据输入应用程序。

但是,我正在使用的表单不​​会输出我的 NoneType 值,因为我试图使用 filters 来执行此操作,如此 stackoverflow 线程所示:Get None from a Fields data in instead of an empty string

但是结果并不像预期的那样,因为我仍然只收到字符串。

我的表格

class MyForm(Form):
    event_date = DateField('Event Date:', format='%Y-%m-%d', validators=[DataRequired()], filters=[lambda x: x or None])
    person = StringField('Person', filters=[lambda x: x or None])
    office = QuerySelectField(query_factory=get_all_offices, allow_blank=True,
                              filters=[lambda x: x or None])
    event_type = QuerySelectField(query_factory=get_all_event_types, allow_blank=True, filters=[lambda x: x or None])
    submit = SubmitField('Search')

渲染

@app.route('/myform', methods=['GET', 'POST'])
def myform():
    if request.method == 'GET':
        form = MyForm()
        return render_template('my_form.html', form=form)
    else:
        print(request.form)
        context = {}
        event_date = request.form['event_date']
        office = request.form['office']
        person = request.form['person']
        event_type = request.form['event_type']
        print(person)
        print(event_date)
        print(type(office))
        print(event_type)

输入

输出

如您所见,office 和 event 类型作为字符串对象传入,值为“__None”。

如果可以让表单处理将'''__None' 转换为内置NoneType 的任何想法?

编辑:个人/办公室架构


class Person(Base):
    __tablename__ = 'people'

    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(64), nullable=False)
    political_party = Column(String(64), nullable=False)
    ap_candidate_id = Column(String(64), nullable=False)

    def __repr__(self):
        return self.name


class Office(Base):
    __tablename__ = 'offices'

    id = Column(Integer, primary_key=True, autoincrement=True)
    desc = Column(String(64), nullable=False)

    def __repr__(self):
        return self.desc


class Event(Base):
    __tablename__ = 'events'

    id = Column(Integer, primary_key=True, autoincrement=True)
    event_date = Column(DateTime, nullable=False)
    office_id = Column(Integer, ForeignKey(Office.id))
    office = relationship('Office', backref='events')
    winner_id = Column(Integer, ForeignKey(Person.id))
    winner = relationship('Person', foreign_keys=winner_id, backref='events_won')
    loser_id = Column(Integer, ForeignKey(Person.id))
    loser = relationship('Person', foreign_keys=loser_id, backref='events_lost')
    event_type_id = Column(Integer, ForeignKey(EventType.id))
    event_type = relationship('EventType', backref='events')
    state_id = Column(Integer, ForeignKey(State.id))
    state = relationship('State', backref='state_events')

    def __repr__(self):
        return '{0} - {1}'.format(self.office, self.event_date)

【问题讨论】:

    标签: python flask sqlalchemy wtforms flask-wtforms


    【解决方案1】:

    你在做

    print request.form['event_date']
    

    所以基本上你只是打印浏览器发布的数据。您甚至没有使用您创建的 MyForm 类。您需要将您的 request.form 数据传递给您的 MyForm 类,以便它可以解析它。稍后使用您的 MyForm 类实例。

    你需要做类似的事情

    def myform():
        if request.method == 'GET':
            form = MyForm()
            return render_template('my_form.html', form=form)
        else:
            form = MyForm(request.form)
            if form.validate():
                print form.event_date.data
                print form.office.data
                print form.person.data
                print form.event_type.data
    

    更多详情,请通过docs了解如何处理视图中的表单。

    【讨论】:

    • 这是我所缺少的,但一个简短的问题,对我来说,我必须删除 if form.validate() 才能让 hte 打印成功......不知道为什么
    • 您可以随时打印表单的错误字典 form.errors 以查看表单验证失败的原因。
    【解决方案2】:

    您的过滤器需要考虑到该值可能是字符串值"__None",目前您的过滤器只是检查该值是否不存在。像下面这样的东西应该可以工作(未经测试)。

     person = StringField('Person', filters=[lambda x: x or None, lambda x: None if x == '__NONE' else x])
    

    【讨论】:

      猜你喜欢
      • 2021-09-13
      • 2014-01-17
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      • 2020-02-21
      • 2020-02-27
      • 2014-11-18
      • 1970-01-01
      相关资源
      最近更新 更多