2015-07-01 18 views
5

benim models.py:TypeError: için desteklenmeyen işlenen türü (ler): - 'datetime.time' ve '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 

benim 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},) 

benim forms.py: Aslında benim modelinde 'intime' ve 'outtime' farkına dayanılarak saatlik toplam sayısını hesaplamak için çalışıyorum

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',) 

s.py dosyası ama erroe üzerinde yükselir. Bence sentaks hatası yapıyorum. Herhangi biri olabilir mi Lütfen bana doğru sözdizimi veya yöntemi nedir? Herhangi bir vücut lütfen bana bunu düzeltmek için ne yapmamı önerir? Eğer bir datetime.time bir datetime.time çıkarma olamaz çünkü

+1

Ben emin değilim. İsteğe bağlı olarak döndüren bir yönteme sahip olmak daha iyidir. –

+0

Peki, şablonlarımda nasıl gösterebilirim? Böyle bir işlevi yaptığımı farz edelim, o zaman şablonlarımda kullanıcıya nasıl gösterebilirim? –

+1

Tam olarak aynı şekilde. Modelde bir yöntemse ve argüman almazsa, doğrudan şablondan çağırabilirsiniz. –

cevap

3

öyle. Onları datetime.datetime nesnelerine dönüştürün ve kullanabileceğiniz datetime.timedelta nesnesini döndürür. Aslında veritabanına saklayabilirsiniz böylece

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

Bu gerçekleşmediği takdirde, ben de saniye veya bir kayan nokta gösterimine timedelta dönüştürme öneriyoruz.

DÜZENLEME: Yanıtın yarısını almak için yorumlarda çekti.

Örneğin - (tamsayı) saniye sayısını kaydetmek istiyorsanız, kullanarak TimeDelta'dan dönüştürebilirsiniz. Eğer bir alanda bu saklamak istediğiniz neden trivially arasından arada ve saatler dışında hesaplandığında

+2

, "float (td.days) + float (td.seconds)/float (86400)" yerine td/timedelta (gün = 1) 'i kullanın. 'Td.total_seconds() kullanın' yerine 'timedelta.days * 86400 + timedelta.seconds' (eğer tamsayı saniyeye kesecek şekilde, mikrosaniye damla istiyorsanız, siz' td // timedelta (saniye = 1) 'kullanabilirsiniz). Timedelta (someSeconds/86400) 'yerine timedelta (saniye = some_seconds)' seçeneğini kullanın. Bazı konularla ilgili soruları yanıtlayacaksanız lütfen [ilgili belgeleri okuyun] (https://docs.python.org/3/library/datetime.html#timedelta-objects). – jfs

+0

"Onları datetime.datetime dönüştür", ama nasıl? – jonalv

+0

Bu, ancak özellikle neyi denediğinizi bilmeden, ben 'datetime.combine' kullanma eğilimindeyim. – OldTinfoil