2015-07-01 20 views
5

models.py tôi:Lỗi Loại: không được hỗ trợ loại toán hạng (s) cho -: 'datetime.time' và '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 tôi:

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

của tôi 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',) 

Thật sự tôi đang cố gắng để tính toán tổng số giờ dựa trên sự khác biệt của 'intime''outtime' trong mô hình của tôi s.py tập tin nhưng nó tăng lên trên erroe. Tôi nghĩ rằng tôi đang làm lỗi cú pháp. Ai có thể Vui lòng cho tôi biết cú pháp hoặc phương pháp chính xác là gì? Bất kỳ cơ thể nào cũng đề nghị tôi phải làm gì để sửa chữa nó?

+1

Tôi không chắc chắn lý do tại sao bạn muốn lưu trữ điều này trong một trường, khi nó được tính toán một cách trivially từ trong và ngoài lần. Tốt hơn là nên có phương thức trả về theo yêu cầu. –

+0

Vậy làm thế nào tôi có thể hiển thị nó trong các mẫu của tôi? Giả sử tôi đã thực hiện một chức năng như vậy thì làm thế nào tôi có thể hiển thị nó trong các mẫu của tôi cho người dùng? –

+1

Cũng giống như vậy. Nếu đó là một phương thức trên mô hình và không có đối số, bạn có thể gọi nó trực tiếp từ mẫu. –

Trả lời

3

Đó là vì bạn không thể trừ số datetime.time từ số datetime.time. Chuyển đổi chúng thành các đối tượng datetime.datetime và nó sẽ trả lại đối tượng datetime.timedelta mà bạn có thể sử dụng.

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

Không đó, tôi muốn giới thiệu chuyển đổi timedelta vào một trong hai giây hoặc một đại diện dấu chấm động, do đó bạn thực sự có thể lưu trữ nó vào cơ sở dữ liệu.

CHỈNH SỬA: Từng nhận xét để nhận được một nửa câu trả lời.

Ví dụ - nếu bạn muốn lưu số giây (số nguyên), bạn có thể chuyển đổi từ số TimeDelta bằng cách sử dụng secs = td // timedelta(seconds=1).

+2

sử dụng 'td/timedelta (days = 1)' thay vì 'float (td.days) + float (td.seconds)/float (86400)'. Sử dụng 'td.total_seconds()' thay cho 'timedelta.days * 86400 + timedelta.seconds' (nếu bạn muốn giảm micro giây, để cắt ngắn thành số nguyên giây, bạn có thể sử dụng' td // timedelta (seconds = 1) '). Sử dụng 'timedelta (seconds = some_seconds)' thay vì 'timedelta (someSeconds/86400)'. Xin vui lòng, [đọc các tài liệu tương ứng] (https://docs.python.org/3/library/datetime.html#timedelta-objects) nếu bạn sẽ trả lời các câu hỏi về một số chủ đề. – jfs

+0

"Chuyển đổi chúng thành datetime.datetime", nhưng làm cách nào? – jonalv

+0

Nó phụ thuộc, nhưng không biết những gì bạn đang cố gắng cụ thể, tôi có xu hướng sử dụng 'datetime.combine'. – OldTinfoil

Các vấn đề liên quan