2015-11-25 81 views
1

型號:的Django的DateField初始/默認值驗證失敗

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的autocreating一個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被渲染爲「十一月25,2015'。試圖在表單中提交該值會導致驗證失敗:

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

我錯過了什麼嗎? Django不應該輸出可以通過valdiation的初始值嗎?

+0

[此問題](http://stackoverflow.com/q/27530394/1473772)可能會幫助你。 –

+0

問題是我使用Django的內置功能,我沒有手動定義表單。 –

回答

0

我剛剛意識到我已經直接渲染order_form.deliver_after.value,這是一個date對象。我可能需要使用Django DateInput小部件來呈現值。

+0

用'order_form.deliver_after.initial'替換那個工作嗎? –

+1

你也可以使用一個過濾器:'value =「{{order_form.deliver_after.value | date:」Y-m-d「}}」' –

+0

@AngelCruijff這就是我所做的工作。 Django確實通常依賴小部件來正確設置日期輸入值的格式。 –

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 }}