2

每当我使用 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好像该字段在数据库中为空。

4

3 回答 3

2

问题是由我对所有文本字段使用的 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 ""

解决了这个问题。

defaultWTForms字段属性似乎不起作用的事实使问题更加复杂。使用此字段定义:

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>Give的 HTML<td></td>不是<td>Nada</td>

于 2013-05-08T16:51:32.873 回答
0

恐怕我想不出 WTForms 批准的设置默认值的方法,因为任何传递给默认值的东西都会是……默认值。因此,如果我们将其定位在数据库选择级别,您可以使用类似这个问题的内容;

如何在 python 中使用 MySQLdb 模块覆盖聚合查询中的 NULL 值?

因此,将其与您的代码相结合:

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)

这有帮助吗?

于 2013-05-07T22:32:42.057 回答
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])

祝你好运!

于 2016-04-24T01:18:18.637 回答