[英]Django ModelForm not validating correctly with custom date format
我正在使用Django的forms.ModelForm制作表單,但我不想為日期字段使用默認格式(在我的語言環境中,這是'%Y-%m-%d'
)。 我不記得為什么要更改它,但是到現在,我決心找出問題所在。
看來這個問題已經被問過很多次了,但是大多數問題都略有不同,否則答案無濟於事。
這是我的表單類:
class RejectionForm(forms.ModelForm):
class Meta:
model = Rejection
fields = ['date',
'plant',
'part',
'defects',
'shift',
'station',
'worker',
'quantity',
'location',
'rejected_by',
'remark']
widgets = {
'date': forms.DateInput(attrs={'class': 'date'}, format='%m-%d-%Y')
}
error_css_class = 'danger'
我也嘗試過這樣:
class RejectionForm(forms.ModelForm):
date = forms.DateField(
input_formats=['%m,-%d-%Y'],
widget=forms.DateInput(
attrs={'class': 'date'},
format='%m-%d-%Y'
)
)
class Meta:
model = Rejection
fields = ['date',
'plant',
'part',
'defects',
'shift',
'station',
'worker',
'quantity',
'location',
'rejected_by',
'remark']
error_css_class = 'danger'
但這也不起作用。 也許出於完全不同的原因,但我擺脫了它。 從現在開始,我仍將參考第一個示例。
我已經檢查了在提交表單時使用Chrome的開發者控制台發送的POST數據,並使用所需的格式發送了該數據。 而當預先填充時,已經存在的值也是正確的。 因此,我認為問題不在於客戶,也不在於表單的呈現方式。
似乎有些奇怪的是,如果我以默認格式鍵入日期,它確實可以驗證。 但它仍以自定義格式呈現。
此外,我已經在禁用L10N和I18N的情況下進行了嘗試。 我從這個問題的第二個答案中得到了這個主意。 不幸的是(但也很幸運),它沒有用。
萬一有人需要它,這里是模板之一:
{% extends 'defective/base.html' %}
{% block content %}
<form action="{% url 'defective:edit-id' rej_id=rej_id %}" method="POST" id="rejection_form" class="form-group create-form">
{% csrf_token %}
<table class="table table-hover">
{{ form.as_table }}
</table>
<input type="submit" value="Save and view" class="btn btn-primary"><br>
</form>
<script>
$('.date').datepicker({dateFormat: 'mm-dd-yy'});
</script>
{% endblock %}
以及相關部分的相應視圖:
instance = get_object_or_404(Rejection, pk=rej_id)
form = RejectionForm(request.POST, instance=instance)
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('defective:view-id', kwargs={'rej_id': rej_id}))
else:
context = {'title': 'Edit an entry',
'rej_id': rej_id,
'form': form}
return render(request, 'defective/edit.html', context)
我不確定確切需要什么,因此隨時詢問您是否還想看到其他內容。
編輯:可能值得注意的是,它過去確實可以工作。 我不確定它什么時候停止,但是我記得它在開始使用django-filter之前是可以工作的。
我決定不使用它,並刪除了為此添加的所有內容。 我什么也找不到,它甚至沒有要求編輯視圖或表單,只是添加了一個用於過濾器的新文件,並添加了一個指向應用程序附帶的基於類的視圖的URL。 現在都不存在。
作為對以上評論的回應,第一種方法不起作用的原因是DateInput
上的format
參數僅控制將顯示該字段的初始值的格式 。 (來自docs )。
它不控制如何解析提交的數據-即, DateField
仍將嘗試使用其默認格式來解析提交的數據。 要進行更改,您需要在DateField
( docs )上使用input_formats
參數。
因此,實際上,您需要像在第二次嘗試中一樣設置兩者。 唯一的問題是您的格式中有一個逗號。
如果您在整個項目中使用一致的日期格式,則只需使用DATE_INPUT_FORMATS設置即可正確配置DateField
和DateInput
以使用相同的格式。 這樣,您不必單獨指定它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.