Django运行报ValueError:空时间数据不匹配%Y-%m-%d格式如何解决
报错原因
- 变量赋值错误:POST逻辑块内你将
date_from的取值赋值给了变量x,没有赋值给user_input_date_from,导致该变量一直保持初始的空字符串值,解析时自然匹配不到格式 - 核心逻辑错误:日期解析、数据计算的全部逻辑都写在了
request.method == 'POST'的判断块外,不管是GET请求(用户首次打开页面还没提交表单)还是不符合要求的POST请求,都会执行日期解析代码,此时两个日期变量都是空字符串,直接抛出格式错误 - 校验缺失:没有做表单非空校验,即使用户提交表单时没选日期,也会进入后续解析逻辑抛出错误
解决方案
将日期解析、数据生成的所有逻辑都挪到POST判断块内,修正变量赋值错误,同时添加参数校验逻辑,GET请求时直接返回空页面即可,修正后的视图代码如下:
import datetime as dt import requests from django.shortcuts import render def indexview(request): url=requests.get('https://data.covid19india.org/v4/min/timeseries.min.json') json_data=url.json() # 初始化返回数据,GET请求时直接传给模板 dict_pass={ 'dates':[], 'otp':[] } if request.method == 'POST': # 获取所有提交参数 user_input_state=request.POST.get('state') user_input_date_from=request.POST.get('date_from') # 修正变量赋值错误 user_input_date_to=request.POST.get('date_to') user_data_type=request.POST.get('data_period') user_required_type=request.POST.get('required_type') # 参数非空校验,避免空值进入解析逻辑 if not all([user_input_state, user_input_date_from, user_input_date_to, user_data_type, user_required_type]): return render(request,'index.html',dict_pass) # 日期解析增加异常捕获,避免格式错误导致程序崩溃 try: start_date_object = dt.datetime.strptime(user_input_date_from,"%Y-%m-%d").date() end_date_object = dt.datetime.strptime(user_input_date_to,"%Y-%m-%d").date() except ValueError: return render(request,'index.html',dict_pass) # 补充日期范围合法性校验 if end_date_object < start_date_object: return render(request,'index.html',dict_pass) days = end_date_object - start_date_object dates=[] otp=[] for i in range(days.days+1): dates.append(str(start_date_object+dt.timedelta(days=i))) for i in dates: try: otp.append(json_data[user_input_state]['dates'][i][user_data_type][user_required_type]) except KeyError: otp.append(0) # 更新返回数据 dict_pass={ 'dates':dates, 'otp':otp } # 所有请求统一返回 return render(request,'index.html',dict_pass)
如果要优化前端体验,可给input标签加required属性,让浏览器自动阻止用户空值提交:
<input type="date" name="date_from" required><br> <input type="date" name="date_to" required>
内容的提问来源于stack exchange,提问作者Ram Priyatham
相关产品推荐
相关产品推荐

