Flask - WTForm - 将表单数据获取为 NoneType 而不是 String
Flask - WTForm - Get Form Data as NoneType as opposed to String
为了解决这个问题,我在网上搜索了一段时间。
我正在研究概念验证,一个简单的输入输出数据输入应用程序。
但是,我正在使用的表单不会输出我的 NoneType 值,因为我正在尝试使用 filters
来执行此操作,如此 Whosebug 线程中所示: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 type 作为字符串对象出现,值为“__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)
您的过滤器需要考虑该值可能是字符串值 "__None"
,目前您的过滤器只是检查该值是否不存在。像下面这样的东西应该可以工作(未经测试)。
person = StringField('Person', filters=[lambda x: x or None, lambda x: None if x == '__NONE' else x])
你在做
print request.form['event_date']
所以基本上你只是打印浏览器发布的数据。您甚至没有使用您创建的 MyForm
class。您需要将 request.form
数据传递给 MyForm
class 以便它可以解析它。稍后使用您的 MyForm class 实例。
你需要做类似的事情
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如何在视图中处理表单。
为了解决这个问题,我在网上搜索了一段时间。
我正在研究概念验证,一个简单的输入输出数据输入应用程序。
但是,我正在使用的表单不会输出我的 NoneType 值,因为我正在尝试使用 filters
来执行此操作,如此 Whosebug 线程中所示: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 type 作为字符串对象出现,值为“__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)
您的过滤器需要考虑该值可能是字符串值 "__None"
,目前您的过滤器只是检查该值是否不存在。像下面这样的东西应该可以工作(未经测试)。
person = StringField('Person', filters=[lambda x: x or None, lambda x: None if x == '__NONE' else x])
你在做
print request.form['event_date']
所以基本上你只是打印浏览器发布的数据。您甚至没有使用您创建的 MyForm
class。您需要将 request.form
数据传递给 MyForm
class 以便它可以解析它。稍后使用您的 MyForm class 实例。
你需要做类似的事情
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如何在视图中处理表单。