Django日期比较报错:strptime参数应为字符串而非DeferredAttribute求助
问题解决方案
核心错误分析
报错strptime() argument 1 must be str, not DeferredAttribute的原因有两个:
- 错误引用了类属性
Profile.biometry_date而非实例属性self.biometry_date biometry_date是Django的DateField,本身已经是date类型对象,不需要用strptime做字符串转日期的操作
另外代码里还存在两个潜在问题:
- 没有处理
biometry_date为null的情况,会触发空值报错 - 模板里混淆了
customer和profile变量,导致渲染异常
修正后的模型代码
from django.db import models from datetime import datetime, timedelta class Customer(models.Model): # 类名遵循PEP8规范,首字母大写 first_name = models.CharField(max_length=255, default='') last_name = models.CharField(max_length=255, default='') biometry_date = models.DateField(blank=True, null=True) # DateField不需要default='',null=True即可 @property def is_due(self): if not self.biometry_date: # 处理空值情况 return False today = datetime.now().date() reminder_delta = timedelta(days=10) # 匹配需求的提前10天提醒 # 计算距离预约日期的天数,小于等于10天则返回True return (self.biometry_date - today) <= reminder_delta
修正后的模板代码
{% if customer.is_due %} <td class="text-right"> <span class="badge badge-danger">{{ customer.biometry_date }}</span> </td> {% else %} <td>{{ customer.biometry_date }}</td> {% endif %}
关键修正点说明
- 实例属性引用:将
Profile.biometry_date改为self.biometry_date,确保访问当前实例的日期字段 - 移除不必要的类型转换:直接使用
self.biometry_date(DateField返回的是date对象)和today做差值计算 - 空值处理:增加
if not self.biometry_date判断,避免空值引发的AttributeError - 变量统一:模板里将
profile.biometry_date改为customer.biometry_date,和上下文变量保持一致 - 匹配业务需求:将原代码的30天时间差改为需求的10天,符合提前提醒的业务逻辑
内容的提问来源于stack exchange,提问作者St JC
相关产品推荐
相关产品推荐

