【发布时间】:2018-05-08 21:16:53
【问题描述】:
我使用 WTForms 为数据过滤定义表单,它的定义如下(我的目标是为 BooleanFields 设置用户指定的标签,我让每个用户为字段命名标签并将字段名称保存到 Google Datastore):
class MainFilterForm(FlaskForm):
"""
Represents main filter form.
"""
start_date = pendulum.parse(
str(pendulum.today().year)
+ str(pendulum.today().month)
+ '01')
end_date = pendulum.today()
calendar_colors_descriptions = CalendarColorsDescription(
users.get_current_user().user_id()
).get_colors_description()
search_query = StringField(
'Search',
[
validators.Length(min=1, max=128),
validators.optional()],
default=None)
start_date = DateField(
'Start date',
[validators.required()],
format='%Y-%m-%d',
default=start_date)
end_date = DateField(
'End date',
[validators.required()],
format='%Y-%m-%d',
default=end_date)
i_am_owner = BooleanField(
'I am owner',
default=False)
include_all_day_events = BooleanField(
'Include all day events',
default=False)
selected_colors_calendar_color = BooleanField(
calendar_colors_descriptions[0],
default=True)
selected_colors_color1 = BooleanField(
calendar_colors_descriptions[1],
default=True)
selected_colors_color2 = BooleanField(
calendar_colors_descriptions[2],
default=True)
selected_colors_color3 = BooleanField(
calendar_colors_descriptions[3],
default=True)
selected_colors_color4 = BooleanField(
calendar_colors_descriptions[4],
default=True)
selected_colors_color5 = BooleanField(
calendar_colors_descriptions[5],
default=True)
selected_colors_color6 = BooleanField(
calendar_colors_descriptions[6],
default=True)
selected_colors_color7 = BooleanField(
calendar_colors_descriptions[7],
default=True)
selected_colors_color8 = BooleanField(
calendar_colors_descriptions[8],
default=True)
selected_colors_color9 = BooleanField(
calendar_colors_descriptions[9],
default=True)
selected_colors_color10 = BooleanField(
calendar_colors_descriptions[10],
default=True)
selected_colors_color11 = BooleanField(
calendar_colors_descriptions[11],
default=True)
CalendarColorsDescription 类返回代表布尔字段所需标签的字符串列表(这些值存储在 Google 数据存储中)。
这个表单展示在Jinja2和Flask渲染的dashboard主页上(这里只贴Flask类的相关部分):
@APP.route('/dashboard', methods=('GET', 'POST'))
def dashboard():
"""
Main page handler, shows stats dashboard.
"""
form = MainFilterForm()
calendar_events = get_events(
calendar_service,
form.search_query.data,
form.start_date.data,
form.end_date.data,
form.i_am_owner.data,
form.include_all_day_events.data,
form.selected_colors_calendar_color.data,
form.selected_colors_color1.data,
form.selected_colors_color2.data,
form.selected_colors_color3.data,
form.selected_colors_color4.data,
form.selected_colors_color5.data,
form.selected_colors_color6.data,
form.selected_colors_color7.data,
form.selected_colors_color8.data,
form.selected_colors_color9.data,
form.selected_colors_color10.data,
form.selected_colors_color11.data)
return flask.render_template(
'dashboard.html',
calendar_events=calendar_events,
form=form)
在第一次运行时,所有标签都已正确设置和显示。但是当我更改 Datastore 中的值(通过另一个表单)时,表单标签中的值永远不会更新,它们保持不变,除非我重新启动网络服务器。
我尝试将“调试”打印到程序的不同部分并输出从 Datastore 读取数据的类,并且输出始终有效并且与预期值同步。在我看来(对我来说这完全是魔法),
form = MainFilterForm()
在第一次 HTTP 请求时仅执行一次(因为我也尝试将“调试”打印到 MainFilterForm 定义,但此打印仅在第一次 HTTP 请求时显示)。
我尝试手动设置标签:
form.selected_colors_calendar_color.label = calendar_colors_descriptions[0]
行后:
form = MainFilterForm()
但我相信来自 Jinja2 的错误“TypeError: 'str' object is not callable”。
【问题讨论】:
标签: python google-app-engine flask jinja2 wtforms