模型:
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的初始值吗?
答案 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 }}
之类的操作。