Django中获取用户输入日期并存入Admin的实现与报错处理
报错根因
- 你从前端date输入框拿到的
stamp_date是YYYY-MM-DD格式的纯字符串,代码里直接把这个字符串塞给datetime.date()做参数,完全不符合方法调用要求——datetime.date()需要接收年、月、日三个整数参数,直接传字符串会直接触发类型错误,这就是提交表单就崩溃的核心原因。 - 代码里重复导入了两次
Form1,导入路径还不一致,会引发模块加载的冗余冲突。 - 视图代码没有用标准Django视图函数包裹,缺少框架必需的
request入参定义,本身结构就不符合运行要求。 - Admin页异常是因为之前提交失败后,数据库表内写入了格式非法的脏数据,后台查询时无法被正常解析。
修正后的模块代码
models.py
模型的DateField定义本身没有问题,不需要调整,保持原定义即可:
from django.db import models class Form1(models.Model): stamp_date = models.DateField()
views.py
修正冗余导入、补全视图结构、替换正确的日期转换逻辑:
from django.shortcuts import render, HttpResponse import datetime from .models import Form1 # 补全标准Django视图函数结构 def form1_view(request): if request.method == "POST": # 获取前端提交的日期字符串 stamp_str = request.POST.get('stamp_date') try: # 用strptime把固定格式的字符串解析为date对象 stamp_date = datetime.datetime.strptime(stamp_str, "%Y-%m-%d").date() # 直接调用create方法写入数据库 Form1.objects.create(stamp_date=stamp_date) except (ValueError, TypeError): # 非法日期格式的兜底提示,避免直接抛出500错误 return HttpResponse("提交的日期格式不合法,请重新填写") return render(request, 'form1.html')
注意:之前的写法datetime.date(stamp_date)无法正常工作,因为它不能直接接收整个日期格式的字符串做参数。
form1.html
表单结构不需要大改,只要保证input的name属性和后端取值的键名完全一致即可:
<form method="POST" action="/form1/"> {% csrf_token %} <div class="form-group"> <label for="exampleFormControlInput1">Security Stamp Date</label> <input type="date" class="form-control" id="exampleFormControlInput1" name="stamp_date" required> </div> <button type="submit" class="btn btn-primary"> Submit </button> </form>
Admin页异常修复方法
进入应用对应的数据库表,删除所有格式异常的旧记录,重启Django开发服务器后,Admin页即可正常访问、录入数据。
可选优化:如果不想手动写日期字符串转对象的逻辑,可以直接使用Django内置的
ModelForm,框架会自动完成格式校验、类型转换的全流程,大幅减少手动代码的出错概率。
内容的提问来源于stack exchange,提问作者Sameer Atharkar
相关产品推荐
相关产品推荐

