Django中的日期处理注意事项和自定义时间格式转换
模型视图表单路由
# 模型表示
class EventContent(models.Model):
# ······
end_time = models.DateTimeField(default=timezone.now, verbose_name='事件结束时间')
# ······
# 表单
class EventContentForm(forms.ModelForm):
class Meta:
model = EventContent
fields = ('end_time', )
# 路由
urlpatterns = [
url(r'^event/create/$', CreateEvent.as_view(), name='event_create'),
# ······
]
# 视图
class CreateEvent(View):
def get(self, request):
event_content_form = EventContentForm()
return render(request, 'event_create.html',
{
'event_content_form': event_content_form,
})
def post(self, request):
event_content_form = EventContentForm(request.POST, request.FILES)
print(event_content_form)
if event_content_form.is_valid():
print('保存数据库')
return render(request, 'event_create.html',
{
'event_content_form': event_content_form,
})
前端页面
{{ event_content_form.end_time.errors }}
问题处理过程
当访问 http://127.0.0.1:8000/event/create/ ,会渲染时间表单
后端时间格式:五月 22, 2018, 4:14 p.m.
{{ event_content_form.end_time.value }}
渲染出来的结果是五月 22, 2018, 4:14 p.m.
也就是后台时间默认的格式
如果我们直接提交,五月 22, 2018, 4:14 p.m.
是验证不通过的
后端print打印的html代码为:
- 输入一个有效的日期/时间。
前端时间格式:2018-05-23 09:00
点击事件控件修改时间,会修改成默认的格式2018-05-23 09:00
然后提交,未出现错误,表明时间格式2018-05-23 09:00
正确,提交成功
但是页面渲染的最初结果从五月 22, 2018, 4:14 p.m.
格式的时间变成2018-05-23 09:00
这样格式,感觉有点奇怪。
自定义时间格式转换测试
后端时间格式:2018年05月22日 16:54:08
修改settings.py文件
修改为自己想显示的格式
# USE_L10N = True
USE_L10N = False
DATE_FORMAT = 'Y年m月d'
DATETIME_FORMAT = 'Y年m月d日 H:i:s'
访问链接渲染{{ event_content_form.end_time.value }}
出来的时间格式2018年05月22日 16:54:08
,也就是和后端相同的显示。
前端时间格式:2018年05月23日 09:00:00
修改时间控件js
然后通过时间控件选择时间2018年05月23日 09:00:00
,提交也会出问题
前端时间格式:2018-05-23 10:00:00
修改时间控件的格式化
此时访问链接显示的格式同样是2018年05月22日 17:03:24
,使用时间控件选择一个时间2018-05-23 10:00:00
,提交没有出错
经过多次验证,表明前后端传递时间的格式为2018-05-23 10:00:00
才能提交成功
最终结果
后端设置时间格式:'Y-m-d H:i:s'
为了前后端时间显示统一,修改后端时间的显示格式
# USE_L10N = True
USE_L10N = False
DATE_FORMAT = 'Y-m-d'
DATETIME_FORMAT = 'Y-m-d H:i:s'
注意事项:如果USE_L10N设置为了True,那么语言环境规定的格式具有更高的优先级并将被应用,即DATE_FORMAT不生效。
这里可用的格式化字符串的其他写法参见Django官方文档:
https://docs.djangoproject.com/en/2.0/ref/templates/builtins/#date;
即后端显示时间格式变为2018-05-26 15:58:28
刷新后台,显示新格式的时间。
前端设置时间格式:"yyyy-mm-dd hh:ii:ss"
修改时间控件
可通传递时间格式:2018-05-24 18:00:17
模板
{{ event_content_form.end_time.errors }}
前端格式化时间
另外在Django页面渲染的时候,html页面从数据库中读出DateTimeField
字段时,显示的时间格式和数据库中存放的格式不一致,另外一个解决办法:可以在页面格式化时间,添加{{ event_content_form.end_time.value|date:"Y年m月d日 H:i:s" }}
类似的过滤器。之后刷新页面,即可正常显示。但这个当时不适合表单提交
不知哪位同学有高见,可以指出。