2015-07-01 106 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

相关问题