在Django中发送POST请求时出现strftime TypeError该如何解决?
问题原因及解决方案
错误根源
你把datetime模块的两个方法使用逻辑搞反了:
datetime.strftime():作用是将datetime/date对象转为指定格式的字符串,第一个入参要求是datetime类型对象,你传入了字符串类型的request.POST['start_date'],所以直接触发类型报错。datetime.strptime():作用是将符合格式的字符串解析为datetime对象,刚好适配你当前的场景。
另外Django的DateTimeField字段直接接收datetime对象即可,不需要你手动转成字符串存储。
修复后的代码
from datetime import datetime from django.http import HttpResponse # 原代码漏了HttpResponse导入,运行时会报错,这里补充 def question_view(request): if request.method == 'GET': return HttpResponse("Вопрос не создан") elif request.method == 'POST': poll_question = request.POST['poll_question'] title = request.POST['title'] # 把strftime改为strptime,解析字符串为datetime对象 start_date = datetime.strptime(request.POST['start_date'],'%Y-%m-%d') Question.objects.create(poll_question=poll_question,title=title, start_date=start_date) return HttpResponse("Вопрос создан") else: # 原代码这里直接返回字符串不符合Django视图返回要求,同步修正 return HttpResponse("Попробуйте снова")
优化建议
生产环境不建议直接取POST参数存库,最好增加参数校验逻辑:
- 可以用Django自带的Form类对
start_date做格式合法性校验,避免传入不符合%Y-%m-%d格式的字符串触发解析报错 - 如果是开发API,更推荐用DRF(Django REST Framework)的序列化器统一处理参数解析、校验逻辑,不需要手动调用datetime方法做转换。
内容的提问来源于stack exchange,提问作者user8887187
相关产品推荐
相关产品推荐

