如何通过Ajax在HTML中修改Django DateTimeField对象的显示格式?
解决Django中日期时间格式化显示问题
你尝试在models.py中用strftime修改日期格式出错,原因是DateTimeField字段需要存储datetime类型对象,不能直接用strftime生成的字符串作为字段值或默认值。下面提供两种靠谱的解决思路:
方案一:后端视图层格式化日期
在返回JsonResponse前,手动遍历查询结果,将日期格式化为目标字符串:
修改views.py的代码:
from django.http import JsonResponse from datetime import datetime from .models import Log def backlog_list(request): account_name = request.POST['account_name'] access_log = Log.objects.filter(source=account_name) formatted_logs = [] for log in access_log: # 用strftime生成目标格式,替换默认的am/pm为要求的A.M./P.M. formatted_date = log.date.strftime("%b. %d, %Y, %I:%M:%S %p").replace("am", "A.M.").replace("pm", "P.M.") formatted_logs.append({ "id": log.id, "source": log.source, "date": formatted_date }) return JsonResponse({"access_log": formatted_logs})
格式符说明:
%b:缩写月份(如Jan)%d:两位数字日期%Y:四位年份%I:12小时制的小时数%M:两位数字分钟%S:两位数字秒数%p:本地AM/PM标识,手动替换为目标格式
方案二:前端JavaScript格式化日期
如果不想改动后端,也可以在前端接收ISO日期字符串后,用JS处理成目标格式:
修改dashboard.html中的AJAX success回调:
success: function(response){ console.log(response); $("#display").empty(); // 自定义日期格式化函数 function formatDateTime(isoStr) { const date = new Date(isoStr); const monthNames = ['Jan.', 'Feb.', 'Mar.', 'Apr.', 'May.', 'Jun.', 'Jul.', 'Aug.', 'Sep.', 'Oct.', 'Nov.', 'Dec.']; const month = monthNames[date.getMonth()]; const day = date.getDate(); const year = date.getFullYear(); let hours = date.getHours(); const period = hours >= 12 ? 'P.M.' : 'A.M.'; // 转换为12小时制,0点转为12 hours = hours % 12 || 12; // 补零处理分钟和秒 const minutes = String(date.getMinutes()).padStart(2, '0'); const seconds = String(date.getSeconds()).padStart(2, '0'); return `${month} ${day}, ${year}, ${hours}:${minutes}:${seconds} ${period}`; } for (var key in response.access_log) { const formattedDate = formatDateTime(response.access_log[key].date); var temp="<div class='container darker'><span class='time-left'>"+formattedDate+"</span></div>"; $("#display").append(temp); } },
为什么models层修改会出错?
models.DateTimeField的default参数需要传入可调用的datetime生成函数(如datetime.now),如果直接用datetime.now().strftime(...),会在模型加载时就生成固定字符串,而非每次创建对象时生成新的datetime,同时数据库无法将字符串存入DateTime类型字段,因此触发错误。日期格式的处理应放在数据输出阶段,而非存储阶段。
内容的提问来源于stack exchange,提问作者ARKONITE Requiem
相关产品推荐
相关产品推荐

