我昨天大部分时间都在寻找答案,但无法弄清楚如何将装饰器添加到模型中。
目标:根据输入天数的用户计算日期。 使用案例:用户输入“开始日期”和表单中的天数。 例如,用户输入的开始日期为1/1/2017,天数为5.计算日期应为1/6/2017。
我无法通过我的模板获取计算字段。
以下代码段。
#models.py
from datetime import datetime, timedelta
from django.db import models
from django_extensions.db.models import TimeStampedModel
from django.urls import reverse
class Lease(TimeStampedModel):
location_name = models.CharField(max_length=120)
contingency_start_date = models.DateField(null=True, blank=True)
contingency_period_in_days = models.IntegerField(default=0)
...
def __str__(self):
return self.location_name
@property
def get_contingency_end_date(self):
return datetime.date(self.contingency_start_date) +
timedelta(days=self.contingency_period_in_days)
class LeaseDetailView(generic.DetailView):
model = Lease
def get_context_data(self, **kwargs):
context = super(LeaseDetailView, self).get_context_data(**kwargs)
context['options_list'] = Option.objects.all()
return context
<li><strong>Start date</strong> {{ lease.contingency_start_date }}</li>
<li><strong>contingency_in_days </strong> {{ lease.contingency_period_in_days }}</li>
<li><strong>End date: </strong> {{ lease.get_contingency_end_date }}</li>
答案 0 :(得分:1)
由于@propery
方法像普通属性一样被访问,因此调用contingency_end_date
。不得作为前缀。考虑使用cached_propery。
您不必将日期字段包装到datetime.date
。从数据库中获取时,它已经是date
对象。
@cached_property
def contingency_end_date(self):
return self.contingency_start_date +
timedelta(days=self.contingency_period_in_days)
在模板中访问它应该与{{ lease.contingency_end_date }}
您是否确认您的lease
实例确实设置了contingency_start_date
?