You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 20:06:04