Django中如何将datepicker日期格式从mm/dd/yyyy改为dd-mm-yyyy
问题:datepicker日期格式修改为dd-mm-yyyy不生效
我尝试将datepicker的日期格式从mm/dd/yyyy修改为dd-mm-yyyy,目前已在settings.py中配置DATE_INPUT_FORMATS为['%d-%m-%Y'],但未生效;之后参考相关方案通过jQuery修改,也没有效果,相关JS代码如下:
<script type="text/javascript"> $(function () { $('#datepicker').datepicker({ dateFormat: 'dd-mm-yy' }); }); </script>
这是看似十分基础的问题,但我暂时找不到解决方案。以下是forms.py的相关代码:
class Calendar(forms.DateInput): input_type = 'date' class AdForm(forms.ModelForm): time_limit = forms.DateInput(format=['%d-%m-%Y']) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['time_limit'].widget.attrs.update({'class': 'form-control mb-3 datepicker'}) class Meta: model = Ad fields = ('time_limit') widgets = { 'time_limit': Calendar(), }
配置完成后最终显示效果仍然不符合预期,效果截图如下:
解决方案
你配置不生效是多个配置冲突、写法错误共同导致的,按以下步骤修正即可:
- 第一个错误:你自定义的Calendar小组件设置了
input_type = 'date',会调用浏览器原生的日期选择器,优先级远高于jQuery UI datepicker,而且原生日期选择器的显示格式跟随系统/浏览器语言设置,无法通过配置强制修改 - 第二个错误:jQuery选择器匹配错误,你给输入框加的是
datepicker类名,但代码里用的是ID选择器$('#datepicker'),匹配不到元素自然不生效 - 第三个错误:AdForm字段定义错误,
time_limit直接定义为了小组件类forms.DateInput,正确应该是定义为forms.DateField再指定widget参数,同时Meta里的widget配置重复覆盖了字段上的配置,存在冲突
修正步骤
- 首先修改forms.py代码:
class Calendar(forms.DateInput): # 删掉input_type = 'date'行,默认使用text类型才能适配jQuery datepicker pass class AdForm(forms.ModelForm): # 正确定义日期字段,指定输入格式和组件属性 time_limit = forms.DateField( input_formats=['%d-%m-%Y'], widget=Calendar(attrs={'class': 'form-control mb-3 datepicker'}) ) class Meta: model = Ad fields = ('time_limit',) # 单元素元组必须加逗号,否则会被识别为字符串 # 删除Meta中重复的widgets配置
- 修正jQuery代码,改用类选择器匹配元素:
$(function () { // 把ID选择器#改为类选择器. $('.datepicker').datepicker({ dateFormat: 'dd-mm-yy' }); });
- 确认settings.py中配置
USE_L10N = False,否则Django会根据区域设置自动覆盖你定义的日期输入格式,保留DATE_INPUT_FORMATS = ['%d-%m-%Y']即可。
内容的提问来源于stack exchange,提问作者d1spstack
相关产品推荐
相关产品推荐

