我通过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。我错过了什么?
谢谢!
答案 0 :(得分:2)
所以,是的......两年后,我也不止一次地受到这个问题的打击。最后,令人沮丧地深究它(我不知道为什么这不是更好的知道/这个问题还没有得到回答),但是如果你看一下({的来源) {1}},DateTimeField
继承自),
https://github.com/wtforms/wtforms/blob/master/wtforms/fields/core.py#L732
DateField
如果设置了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
设置为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
raw_data
但更好的是&#34;正确&#34;处理它,
https://github.com/wtforms/wtforms/blob/master/wtforms/fields/core.py#L256
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))
进程期待 ...
if formdata is not None:
if self.name in formdata:
self.raw_data = formdata.getlist(self.name)
...
,因此对于您的情况,而不是
ImmutableMultiDict
你做了一个完整的&#34;传递一个正确形成的form.date1.process_data(date(2000, 01, 01))
,
ImmutableMultiDict
它希望其字段为字符串,而form.date1.process(ImmutableMultiDict(
[('date1', date(2000, 01, 01).strftime(form.date1.format))]))
字段的字段格式正确,这就是为什么我在DateField
上执行strftime
的原因它,并使用自己的格式,所以我们有点&#34;有点&#34;作弊行为。
为了帮助这个过程,我在几个不同的地方使用它,我使用这个辅助函数,
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))
令人沮丧的是,当你做一个常规的过程时,它并不容易,并且你没有旗帜,或者没有做过原始过程的事情,但是,请不要这样做。这就是你如何做到的,所以现在,
<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
是对的。
答案 1 :(得分:1)
我一直在坚持,所以希望这对以后的人有所帮助... @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))
我希望他们能解决这个问题。