2017-01-30 5 views
0

Ich verbrachte gestern den größten Teil des Tages damit, eine Antwort zu finden, konnte aber nicht herausfinden, wie man den Dekorator zum Modell hinzufügt.Wie kann ich ein Datum in einem Django-Modell berechnen?

Ziel: Berechnen Sie ein Datum, basierend auf dem Benutzer, der die Anzahl der Tage eingibt. Anwendungsfall: Der Benutzer gibt das "Startdatum" und die Anzahl der Tage in einem Formular ein. Beispiel: Der Benutzer gibt ein Startdatum vom 01.01.2017 und Tage = 5 an. Das Rechnungsdatum sollte der 16.01.2017 sein.

Ich konnte das berechnete Feld nicht durch meine Vorlage ziehen.

Codeschnipsel unten.

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

nicht

<li><strong>End date: </strong> {{ lease.get_contingency_end_date }}</li> 
+0

* Durchziehen auf meiner Vorlage. * Wie meinst du das? –

+0

Bitte korrigieren Sie Ihren Einzug. – 2ps

+0

@MosesKoledoye - durch ziehen durch, ich meine, dass der berechnete Wert nicht in der HTML-Vorlage angezeigt wird. – toddkovalsky

Antwort

1

Als @propery Verfahren funktioniert wie eine normale Eigenschaft nennen sie zugegriffen contingency_end_date. Nein, als Präfix erhalten. Erwägen Sie die Verwendung eines cached_propery.

Sie müssen Ihr Datumsfeld nicht in eine datetime.date umbrechen. Es ist bereits ein date Objekt, wenn es aus der Datenbank geholt wird.

@cached_property 
def contingency_end_date(self): 
    return self.contingency_start_date +  
       timedelta(days=self.contingency_period_in_days) 

es in der Vorlage Zugriff sollte mit {{ lease.contingency_end_date }}

arbeiten Haben Sie überprüfen, ob Ihre lease Instanz tatsächlich einen contingency_start_date Satz hat?

+0

erstaunlich! Du hast ein paar Haare wieder auf meinen Kopf gesetzt! Vielen Dank. – toddkovalsky

+1

Ja, aber Sie sollten auch den Fall berücksichtigen, wenn Ihr Startdatum Keine ist oder das Feld nicht nullbar machen kann. Andernfalls könnte die Methode einen Fehler auslösen. – trixn

Verwandte Themen