2015-07-01 121 views
5

我的models.py:類型錯誤:不支持的操作類型爲 - : 'datetime.time' 和 'datetime.time'

class Attendancename(models.Model): 
    teacher_name = models.ForeignKey(Teachername, default='Ram') 
    date = models.DateField('Date', default=datetime.datetime.today) 
    intime = models.TimeField('IN-TIME', auto_now=True) 
    outtime = models.TimeField('OUT-TIME', auto_now=True) 

    def hours_conversion(self): 
     startdelta = datetime.timedelta(hours=self.intime.hours, minutes=self.intime.minutes, seconds=self.intime.seconds) 
     enddelta = datetime.timedelta(hours=self.outtime.hours, minutes=self.outtime.minutes, seconds=self.outtime.seconds) 
     return (enddelta-startdelta).seconds/3600 

    def __str__(self): 
     return "%s" %self.teacher_name 

我views.py:

def add_atten(request): 
    if request.method == 'POST': 
     form = AttendancenameForm(request.POST) 
     if form.is_valid(): 
      form.save() 
      return HttpResponseRedirect(reverse('student:listatten')) 
     else: 
      print(form.errors) 
    else:  
     form = AttendancenameForm() 
    return render(request, 'add_atten.html', {'form': form},) 

我forms.py:

class AttendancenameForm(ModelForm): 
    intime = forms.TimeField(input_formats=('%H:%M',)) 
    outtime = forms.TimeField(input_formats=('%H:%M',)) 
    teacher_name = forms.ModelChoiceField(queryset=Teachername.objects.all()) 
    class Meta: 
     model = Attendancename 
     fields = ('teacher_name', 'date', 'intime', 'outtime',) 

其實我試圖計算的基礎上在我的模型的'intime''outtime'差總小時數s.py文件,但它會超過erroe。我想我在做語法錯誤。任何人都可以請告訴我什麼是正確的語法或方法來做到這一點? 任何機構請建議我該怎麼做才能修復它?

+1

我不知道你爲什麼要把它存儲在一個字段中,當它從進出時間進行平凡計算時。最好有一個方法按需返回它。 –

+0

那麼我該如何在我的模板中展示它?假設我已經做出了這樣的功能,那麼我怎樣才能在我的模板中向用戶展示它? –

+1

完全一樣。如果它是模型上的方法並且不需要參數,則可以直接從模板中調用它。 –

回答

3

這是因爲您不能從datetime.time中減去datetime.time。將它們轉換爲datetime.datetime對象,它將返回一個可用的對象datetime.timedelta

If you're lucky enough to be using Django 1.8, they now have a DurationField that can be used.

做不到這一點,我會建議轉換成timedelta秒或浮點表示,所以你其實可以將其存儲到數據庫中。

編輯:在評論中拉開一半的答案。

例如 - 如果要存儲(整數)秒數,可以使用secs = td // timedelta(seconds=1)TimeDelta轉換。

+2

使用'td/timedelta(days = 1)'而不是'float(td.days)+ float(td.seconds)/ float(86400)'。使用'td.total_seconds()'代替'timedelta.days * 86400 + timedelta.seconds'(如果你想減少微秒,截斷爲整數秒;你可以使用'td // timedelta(seconds = 1)')。使用'timedelta(秒= some_seconds)'而不是'timedelta(someSeconds/86400)'。如果您要回答關於某個主題的問題,請[閱讀相應的文檔](https://docs.python.org/3/library/datetime.html#timedelta-objects)。 – jfs

+0

「將它們轉換爲datetime.datetime」,但如何? – jonalv

+0

這取決於,但不知道你在嘗試什麼,我傾向於使用'datetime.combine'。 – OldTinfoil

相關問題