[英]Flask-WTForms change a submitted datefield value
我通过flask-WTF 扩展使用WTForms。 我想在提交后更改日期字段的值。 下面是一个例子:
class ExampleForm1(Form):
date1 = DateField('Date', description = 'Select date..')
submit_button = SubmitField('OK')
@app.route("/exampleform1", methods=['GET', 'POST'])
def example1():
form = ExampleForm1()
if request.method == 'POST' and form.validate():
print str(form.date1)
print form.date1.data
form.date1.process_data(date(2000, 01, 01))
print str(form.date1)
print form.date1.data
return render_template('example1.html', form=form)
form.date1.process_data(date.today())
return render_template('example1.html', form=form)
这是输出:
<input id="date1" name="date1" type="date" value="2015-03-15">
2015-03-15
<input id="date1" name="date1" type="date" value="2015-03-15"> <-- This isn't updated
2000-01-01 <-- this is updated
该网页仍显示 2015-03-15 而不是 2000-01-01。 我错过了什么?
谢谢!
所以,是的......两年后,我也不止一次受到这个问题的影响。 最后,令人沮丧的是它的底部(我不知道为什么这不为人所知/这个问题还没有得到回答),但是如果你看看( DateTimeField
, DateField
继承自)的来源,
https://github.com/wtforms/wtforms/blob/master/wtforms/fields/core.py#L732
def _value(self):
if self.raw_data:
return ' '.join(self.raw_data)
else:
return self.data and self.data.strftime(self.format) or ''
如果设置了raw_data
,则返回该值。
因此,您可以将raw_data
设置为 None,然后按照面包屑路径将其作为该字段的值返回,
https://github.com/wtforms/wtforms/blob/master/wtforms/fields/core.py#L141
https://github.com/wtforms/wtforms/blob/master/wtforms/meta.py#L47
https://github.com/wtforms/wtforms/blob/master/wtforms/widgets/core.py#L177
def __call__(self, field, **kwargs):
kwargs.setdefault('id', field.id)
kwargs.setdefault('type', self.input_type)
if 'value' not in kwargs:
kwargs['value'] = field._value()
return HTMLString('<input %s>' % self.html_params(name=field.name, **kwargs))
但更好的是“正确”处理它,
https://github.com/wtforms/wtforms/blob/master/wtforms/fields/core.py#L256
...
if formdata is not None:
if self.name in formdata:
self.raw_data = formdata.getlist(self.name)
...
进程期待一个ImmutableMultiDict
,所以对于你的情况,而不是,
form.date1.process_data(date(2000, 01, 01))
你做了一个“完整”的过程,传入一个ImmutableMultiDict
正确的ImmutableMultiDict
,
form.date1.process(ImmutableMultiDict(
[('date1', date(2000, 01, 01).strftime(form.date1.format))]))
它希望它的字段是字符串,而对于一个DateField
,它是字段的正确格式,所以这就是为什么我在它上面做一个strftime
并使用它自己的格式,所以我们“有点”作弊。
为了帮助这个过程,当我在几个不同的地方使用它时,我使用了这个辅助函数,
def full_field_process(field, val):
field.process(ImmutableMultiDict([(field.short_name, val)]))
在你的情况下,会被称为,
full_field_process(
form.date1,
date(2000, 01, 01).strftime(form.date1.format))
令人沮丧的是,当您执行常规流程时,这并不容易,并且您没有标志或可以执行原始流程的东西,但是 c'est la vie。 你就是这样做的,所以现在这个,
<input id="date1" name="date1" type="date" value="2015-03-15">
2015-03-15
<input id="date1" name="date1" type="date" value="2000-01-01">
2000-01-01
是正确的。
我被困在这个问题上,所以我希望这对将来的人有所帮助...@seaders 说
因此,您可以将 raw_data 设置为 None,然后按照面包屑路径将其作为该字段的值返回,
但这对我不起作用。 有效的是将 raw_data 设置为包含日期字符串的列表。 因此,如果您想将表单日期字段设置为“2020-12-01”,您可以这样做
form.target_data.raw_data = ["2020-12-01"]
以及做
form.target_data.process_data(date(2020, 12, 01))
我希望他们有时间解决这个问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.