Flask-WTForms更改提交的日期字段值

时间:2015-03-15 16:47:34

标签: python flask-wtforms

我通过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。我错过了什么?

谢谢!

2 个答案:

答案 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))

我希望他们能解决这个问题。