如何在Django模型中计算日期?

时间:2017-01-30 21:00:45

标签: django python-3.x

我昨天大部分时间都在寻找答案,但无法弄清楚如何将装饰器添加到模型中。

目标:根据输入天数的用户计算日期。 使用案例:用户输入“开始日期”和表单中的天数。 例如,用户输入的开始日期为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)

views.py

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

detail.html

<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>

1 个答案:

答案 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