每当我使用WTForms表单显示数据库中的数据时:
sql = "SELECT * FROM rolodex WHERE rolodex_id = " + rolodex_id
cursor = mdb_connect("DictCursor")
cursor.execute(sql)
row = cursor.fetchone()
form = RolodexEntry(**row)
return bottle.template('entry',rolodex_id=rolodex_id,form=form)
(所有表单字段都是TextFields)
空和NULL数据库字段值显示为“无”。我希望他们只是空虚。我可以想到几种方法来解决这个问题,但我想知道是否有一些WTForms认可的方法将Textfield的默认值设置为空字符串而不是None?
瓶子模板给我一个简单的,有点繁琐的方法来逐个解决这个问题:
<p style='font-weight: bold; color: blue; margin-left: auto; margin-right: auto; width: 50%'>
% if form.firstname.data:
{{form.firstname.data}}
% end
% if form.lastname.data:
{{form.lastname.data}}
% end
</p>
我尝试更改字段定义中的默认属性:
firstname = TextField('First Name',[validators.length(max=40)], default="")
但这没有做任何事情;即如果数据库中的字段为空,则form.firstname.data仍显示为None
。
答案 0 :(得分:2)
问题是由我在所有Textfields中使用的strip_filter过滤器引起的:
strip_filter = lambda x: x.strip() if x else None
,如
cell = TextField('Cellphone', [validators.length(max=25)],
filters=[strip_filter])
将条形滤镜更改为:
strip_filter = lambda x: x.strip() if x else ""
解决了这个问题。
WTForms default
字段属性似乎不起作用,使问题更加复杂。使用此字段定义:
cell = TextField('Cellphone', default = "Nada")
和这段代码:
row['cell'] = ""
form = RolodexEntry(**row)
return bottle.template('entry',rolodex_id=rolodex_id,form=form)
<td>{{form.cell.data}}</td>
的HTML提供了<td></td>
,而不是<td>Nada</td>
答案 1 :(得分:0)
我担心我无法想到WTForms认可的设置默认值的方法,因为传递给默认值的任何东西都是,嗯......默认。因此,如果我们在数据库选择级别对此进行定位,您可以使用类似这样的问题;
How to override NULL value from aggregate query using MySQLdb module in python?
所以将它与你的代码结合起来:
sql = "SELECT * FROM rolodex WHERE rolodex_id = " + rolodex_id
default_value = None
cursor = mdb_connect("DictCursor")
cursor.execute(sql)
row = cursor.fetchone()
row = [value for value in row if value else default_value]
form = RolodexEntry(*row)
return bottle.template('entry',rolodex_id=rolodex_id,form=form)
作为默认设置,您有None
而不是空字符串;
firstname = TextField('First Name',[validators.length(max=40)], default=None)
这有用吗?
答案 2 :(得分:0)
今天我遇到了这个问题,但我使用Flask_WTF,所以我的语法不同。我的解决方案是通过将Optional()
添加到我的validators[]
列表中来解决的。
address_zip_extension = StringField('address_zip_extension', render_kw={"placeholder": "Zip Extension", "section": "address",
'label': 'Zip Extension'}, validators=[Optional(), Length(min=4, max=5)])
对于普通的WTForms,语法不同,但我相信以下内容应该有效。
class MyForm(Form):
name = TextField('Name', [Optional(), my_length_check])
祝你好运!