2017-01-30 26 views
0

昨天我花了大部分時間試圖找到答案,但無法弄清楚如何將修飾器添加到模型中。如何在Django模型中計算日期?

目標:根據用戶輸入的天數計算日期。 使用案例:用戶輸入「開始日期」和表格中的天數。 例如,用戶輸入2017年1月1日開始日期,天數= 5。計算日期應爲2017年6月16日。

我無法獲得計算字段在我的模板上通過。

下面的代碼片段。

#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> 
+0

*拉過我的模板。*你的意思是? –

+0

請修復您的縮進。 – 2ps

+0

@MosesKoledoye - 通過拉直,我的意思是計算的值不顯示在HTML模板中。 – toddkovalsky

回答

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

+0

太棒了!你在我頭上加了幾根頭髮!謝謝。 – toddkovalsky

+1

是的,但你也應該考慮這種情況,當你的開始日期是None或使該字段不可空。否則,該方法可能會引發錯誤。 – trixn