javascript - 验证日期字段
问题描述
我在 django modelform 小部件和 jQuery datepicker 中覆盖了日期格式,它给出了该字段无效的错误
class Sale_Invoice_Main_Page(forms.ModelForm):
class Meta:
model = SaleInvoice
fields = '__all__'
exclude = ['created_at','updated_at','transiction_type']
widgets = {'description' : forms.TextInput(attrs={ 'placeholder' : 'description'}),
'invoice_no' : forms.TextInput(attrs={ 'readonly' : 'True'}),
'total_amount' : forms.TextInput(attrs={ 'readonly' : 'True'}),
'invoice_date' : forms.DateInput(attrs={ 'class' : "vdate" },format=('%d-%m-%Y')),
'due_date' : forms.DateInput(attrs={ 'readonly' : "True" },format=('%d-%m-%Y')),
}
class SaleInvoice(models.Model):
customer = models.ForeignKey(Customer_data , on_delete=models.CASCADE)
invoice_date = models.DateField(null=True,blank=True)
invoice_no = models.PositiveIntegerField(unique=True)
due_date = models.DateField(blank=True,null=True)
address = models.TextField()
total_amount = models.PositiveIntegerField(null=True,blank=True)
description = models.TextField(null=True,blank=True)
transiction_type = models.CharField(max_length=50,blank=True)
author = models.CharField(max_length=30)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.address
jQuery 日期选择器:
{# Date Picker#}
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<link rel="stylesheet" href="/resources/demos/style.css">
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<script>
$( function() {
$( ".vdate" ).datepicker({
dateFormat: "dd-mm-yy"
});
} );
</script>
我想找出我做错了什么,它给出了验证错误
解决方案
有时,本地化可能会有点棘手。通常,您会将DATE_INPUT_FORMATS添加到您的设置中。在日期字段上输入数据时,将接受此列表中的格式,这意味着添加
DATE_INPUT_FORMATS = [
'%d-%m-%Y'
]
到您的设置应该可以解决您的问题。但这有时会有点棘手,因为在这种情况下,区域USE_L10N
设置True
指定的格式具有更高的优先级,并且将被应用。出于这个原因,我建议您不要在 jQuery datepicker 中对日期格式进行硬编码,而是使用默认值并从 DATE_INPUT_FORMATS 获取日期格式。这样的事情应该可以解决问题:
from django.utils import formats
# First date format in default (English) is '%Y-%m-%d', most European languages '%d.%m.%Y' etc.
date_format = formats.get_format("DATE_INPUT_FORMATS")[0]
date_format = date_format.split()[0].replace('%Y', 'YY').replace('%d', 'dd').replace('%m', 'mm')
并将其用作您的模板:
<script>
$( function() {
$( ".vdate" ).datepicker({
dateFormat: "{{ date_format }}"
});
} );
</script>
这样,无论格式优先级如何,日期格式都将匹配。最好在您自己的上下文处理器中包含日期格式。现在它将包含在所有模板的上下文中。
my_context_processor.py
from django.utils import formats
def common_context(request):
''' Common variables used in templates '''
date_format = formats.get_format("DATE_INPUT_FORMATS")[0]
date_format = date_format.split()[0].replace('%Y', 'YYYY').replace('%d', 'dd').replace('%m', 'mm')
return {'date_format ': date_format}
推荐阅读
- php - 从 laravel 中间件调用控制器方法
- mongodb - 如何在官方 MongoDB Go 驱动程序上查找和比较日期?
- python - 如何仅选择值超过阈值的行?
- erlang - 为什么我的代码在 erlang 21 中出现错误,但在 erlang 20 中却没有?
- java - java把利率放在我的抵押贷款计算器上
- reactjs - 渲染带有附加文本的 React 组件列表
- c++ - 什么是 C++ 中的 unordered_set
- python - Python - 按其属性对链接列表进行排序
- python - Python中列表列表的反转
- excel - 在 Excel 中将行转换为列