繁体   English   中英

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

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

谢谢!

所以,是的......两年后,我也不止一次受到这个问题的影响。 最后,令人沮丧的是它的底部(我不知道为什么这不为人所知/这个问题还没有得到回答),但是如果你看看( DateTimeFieldDateField继承自)的来源,

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM