Как отобразить оставшиеся дни и часы в django из DateTimeField? - PullRequest
0 голосов
/ 20 сентября 2019

Здесь у меня есть простая функция для отправки запроса на отпуск и принятия администратором. Этот код работает на данный момент, но я хочу добавить сюда некоторую функцию. Например, если пользователь вводит day = 2, то есть IntegerField, он получаетсохраняет в базе данных, а затем после того, как отпуск был принят функцией ниже def accept_leave(request,pk): Я хочу отобразить оставшиеся дни отпуска (Example:1 day 12 hours and 30 sec. remaining to complete leave ). После 2 дней должно появиться сообщение, как будто вы ушли, завершено.

Я понятия не имею, с чего начать. Как я могу это сделать? Любая помощь будет отличной.

Есть ли какая-либо ошибка в моем подходе?

РЕДАКТИРОВАТЬ: СейчасЯ удалил день (целочисленное поле) и добавил start_day и end_day как DateTimeField.Теперь, как я могу отобразить оставшиеся дни и время отпуска после его принятия?

models.py

class Leave(models.Model):
    staff = models.ForeignKey(get_user_model(),on_delete=models.CASCADE,related_name='staff_leave')
    organization = models.ForeignKey(Organization,on_delete=models.CASCADE,related_name='staff_leave')
    sub = models.CharField(max_length=300)
    msg = models.TextField()
    start_day = models.DateTimeField()
    end_day = models.DateTimeField()
    #day = models.IntegerField(default=0)
    is_accepted = models.BooleanField(default=False)
    is_rejected = models.BooleanField(default=False)
    sent_on = models.DateTimeField(auto_now_add=True)

views.py

def send_leave_request(request):
    form = MakeLeaveForm()
    if request.method == 'POST':
        form = MakeLeaveForm(request.POST)
        if form.is_valid():
            leave_days = form.cleaned_data['day']
            org = form.cleaned_data['organization']
            start_day = form.cleaned_data['start_day']
            end_day = form.cleaned_data['end_day']
            diff = end_day - start_day
            leave_days = diff.days
            print('org',org)
            if leave_days > request.user.staff.organization.max_leave_days:
                messages.error(request,'Sorry can not be sent.Your leave days is greater than {}.'.format(request.user.staff.organization.max_leave_days))
                return redirect('organization:view_leaves')
            else:
                leave = form.save(commit=False)
                leave.staff = request.user
                leave.organization = org
                leave.save()
                return redirect('organization:view_leaves')
    return render(request,'organization/send_leaves.html',{'form':form})

def accept_leave(request,pk):
    leave = get_object_or_404(Leave, pk=pk)
    leave.is_accepted = True
    leave.is_rejected = False
    leave.day = ? 
    leave.save()
    return redirect('organization:leave_detail',leave.pk)

1 Ответ

1 голос
/ 20 сентября 2019

Для вашего запроса на отпуск, почему бы вам не сохранить что-то вроде: start_date и end_date

Идея состоит в том, чтобы (в идеале) хранить только то, что вы не можете вычислить.

Тогда выможет создать свойство python , которое вычисляет количество дней между start_date и end_date (для свойства будет достаточно "fget").Свойство python не будет храниться в вашей базе данных, но это не имеет большого значения, потому что вы можете его вычислить!Так что вам не нужно его хранить.

days = property(fget=_get_days, doc="type: Integer")

Это означает, что всякий раз, когда к атрибуту "days" объекта "Leave" обращаются, вызывается функция "_get_days" для получения того, что вы хотите.

Если self представляет объект Leave, и вы делаете print(self.days), то он напечатает результат _get_days finally.

Часть "doc" здесь, чтобы указать, что ваше свойство возвращаетInteger.Это не обязательно, но это хорошая практика, чтобы не забывать об этом.

Тогда вы должны написать этот метод "_get_days" (он должен быть выше определения вашего свойства, иначе Python не будет знать, что такое "_get_days"

def _get_days(self):
    return self.end_date - self.start_date

(something like that, that you convert into an int somehow)

Более того, для вашей дополнительной функциональности вы должны знать, сколько у вашего пользователя может быть оставлено. Просто сохраните это для пользователя, в вашей пользовательской команде или что вы хотите. Затем, чтобы проверить, есть ли у пользователя оставшиесялистья, которые он может взять, просто просмотрите набор запросов со всеми принятыми им листьями и используйте свойство, упомянутое выше. Затем вы вычтите результат из общего количества листьев, которые может взять пользователь.

...