Django中根据付款剩余时间变更表格字段颜色的问题
Django付款日期字段变色问题修复
你的代码里有几个关键错误导致黄色效果无法触发,下面是修正方案:
问题分析
模型方法逻辑错误:
payment_yellow方法误用了类属性payments.payment_date,应该用实例的self.payment_date- 日期计算顺序搞反了,要算剩余天数得用
付款日期 - 今天,而非反过来 - 日期相减得到的是
timedelta对象,不能直接和整数7比较,必须转换成天数
模板判断逻辑错误:
- 判断黄色的条件写反了,应该是剩余天数≤7才变黄,不是≥7
- 未排除已逾期的情况,逻辑不够严谨
修正后的模型代码
from datetime import date from django.db import models class Payments(models.Model): # 类名首字母大写,符合Python规范 client = models.OneToOneField(HealthQuests, on_delete=models.CASCADE, null=True, blank=True, verbose_name='Cliente') date = models.DateField(default=date.today, verbose_name='Fecha de facturación') payment_date = models.DateField(default=date.today, verbose_name='Fecha de pago') amount = models.FloatField(verbose_name='Monto de pago', default=0) @property def is_overdue_or_due(self): # 判断是否已到付款日或逾期 return self.payment_date <= date.today() @property def is_near_due(self): # 判断是否距离付款日还有7天以内且未逾期 today = date.today() days_remaining = (self.payment_date - today).days return days_remaining <= 7 and days_remaining > 0
修正后的模板代码
<tbody> {% for obj in object_list %} <tr> <td><a href="update_payments/{{ obj.id }}" class="btn">{{ obj.client }}</a></td> <td>{{ obj.date }}</td> <td> {% if obj.is_overdue_or_due %} <div class="p-3 mb-2 bg-danger text-white">{{ obj.payment_date }}</div> {% elif obj.is_near_due %} <div class="p-3 mb-2 bg-warning text-white">{{ obj.payment_date }}</div> {% else %} {{ obj.payment_date }} {% endif %} </td> <td>{{ obj.amount }}</td> </tr> {% endfor %} </tbody>
说明
- 用
@property装饰器把方法转成属性,模板里调用更简洁 - 拆分两个判断属性,逻辑更清晰,也方便后续复用
- 明确
is_near_due的条件:剩余天数≤7且大于0,避免和逾期状态冲突
内容的提问来源于stack exchange,提问作者Axel Bonilla Navarro
相关产品推荐
相关产品推荐

