Django DateField初始值/默认值验证失败

时间:2015-11-25 00:57:28

标签: python django

模型:

def deliver_after_default():
    return timezone.now().date()


deliver_after = models.DateField(default=deliver_after_default,
    blank=True,
    help_text="Don't delivery email or physical card until after this "
    "date. Delivery on this date cannot be guaranteed."
)

我让Django自动创建一个ModelFormf或这个模型。在我的模板中:

      <input class="form-control" name="{{ order_form.deliver_after.html_name }}" value="{{ order_form.deliver_after.value }}" type="date" />

order_form.deliver_after.value呈现为'Nov。 25,2015'。尝试在表单中提交该值会导致验证失败:

{"deliver_after": ["Enter a valid date."]}

我错过了什么吗? Django不应该输出可以通过valdiation的初始值吗?

2 个答案:

答案 0 :(得分:0)

我刚刚意识到我直接渲染order_form.deliver_after.value,这是一个date对象。我可能需要使用Django DateInput小部件来呈现值。

答案 1 :(得分:0)

这也是我的意思。我的第一个倾向是按照上面评论中天使cruijff的建议去做,但这只适用于字段包含日期时的初始表单加载。

如果表单在另一个字段上验证失败,则日期字段值现在将是一个字符串,而|date过滤器最终不会返回任何内容 - 也就是说它会使该字段空白。

为了解决这个问题,我创建了以下模板过滤器:

@register.filter()
def render_value_as_widget_would(bound_field):
    natural_value = bound_field.value()
    if hasattr(bound_field.field.widget, '_format_value'):
        return bound_field.field.widget._format_value(natural_value)
    return natural_value

然后在我的模板中,加载自定义过滤器模块后,我执行了{{ order_form.deliver_after|render_value_as_widget_would }} {{ order_form.deliver_after.value }}之类的操作。