Подтвердить дату и время с датой в базе данных - Django - PullRequest
0 голосов
/ 18 января 2019

Я хочу проверить форму, где я обновляю TimesheetEntry Модель. Я хочу проверить, если timesheet_clock_out_date и timesheet_clock_out_time не меньше чем timesheet_clock_in_date и timesheet_clock_in_time. Если да, то выдайте ошибку «Пожалуйста, введите правильную дату». В моем URL я отправляю primary key из TimesheetEntry

urls.py

path('useradmin/timesheet/clock-out/<int:pk>', views.ClockOutAddView.as_view(), name='admin_timesheet_clock_out'),

Forms.py

class ClockOutForm(forms.ModelForm):
        class Meta:
           model = TimesheetEntry
           fields = [
           'timesheet_clock_out_date',
           'timesheet_clock_out_time',
           ]

Models.py

class TimesheetEntry(models.Model):
       timesheet_users = models.ForeignKey(User, on_delete=models.CASCADE,related_name='timesheet_users')
       timesheet_clock_in_date = models.DateField()
       timesheet_clock_in_time = models.TimeField()
       timesheet_clock_out_date = models.DateField(blank=True, null=True)
       timesheet_clock_out_time = models.TimeField(blank=True, null=True)

Views.py

class ClockOutAddView(LoginRequiredMixin, generic.View):

       template_name = 'admin/clock/clock_form.html'
       success_url = '/useradmin/timesheet/'

       def get(self, request, pk, *args, **kwargs):
           form =  ClockOutForm(instance=TimesheetEntry.objects.get(id=pk))
           return render(request, self.template_name, {'form': form})

       def post(self, request, pk, *args, **kwargs):
           form = ClockOutForm(request.POST, instance=TimesheetEntry.objects.get(id=pk))

           if form.is_valid():

               form.save()

               return HttpResponseRedirect(self.success_url)

           return render(request, self.template_name, {'form': form})

Как я могу проверить дату и время.

1 Ответ

0 голосов
/ 18 января 2019

Я хочу проверить форму, в которой я обновляю модель TimesheetEntry. Я хочу проверить, если timesheet_clock_out_date и timesheet_clock_out_time не меньше чем timesheet_clock_in_date и timesheet_clock_in_time.

Вы можете добавить функцию clean(..) [Django-doc] , вероятно, здесь лучше сделать это на уровне модели, который проверяет это.

from datetime import datetime
from django.core.exceptions import ValidationError

class TimesheetEntry(models.Model):
    timesheet_users = models.ForeignKey(User, on_delete=models.CASCADE,related_name='timesheet_users')
    timesheet_clock_in_date = models.DateField()
    timesheet_clock_in_time = models.TimeField()
    timesheet_clock_out_date = models.DateField(blank=True, null=True)
    timesheet_clock_out_time = models.TimeField(blank=True, null=True)

    def <b>clean</b>(self):
        if self.timesheet_clock_out_date is not None and self.timesheet_clock_out_time is not None:
            dt1 = datetime.combine(self.timesheet_clock_in_date, self.timesheet_clock_in_time)
            dt2 = datetime.combine(self.timesheet_clock_out_date, self.timesheet_clock_out_time)
            if dt1 > dt2:
                raise ValidationError('Please enter proper date.')
        super(TimesheetEntry, self).clean()

Как говорится, приведенная выше модель довольно "странная". Обычно лучше использовать DateTimeField [Django-doc] . Это, например, предотвратит странные ситуации, когда timesheet_clock_out_date равен None, а timesheet_clock_out_time нет, и наоборот.

Обычно каждый не ставит атрибуты перед именем класса, так как это улучшает возможности duck typing.

Вероятно, лучший способ смоделировать это:

from django.core.exceptions import ValidationError

class TimesheetEntry(models.Model):
    <b>users</b> = models.ForeignKey(User, on_delete=models.CASCADE,related_name='timesheet_users')
    <b>clock_in</b> = models.<b>DateTimeField</b>()
    <b>clock_out</b> = models.<b>DateTimeField</b>(blank=True, null=True)

    def <b>clean</b>(self):
        if self.clock_out is not None and self.clock_in > self.clock_out:
            raise ValidationError('Please enter proper date.')
        super(TimesheetEntry, self).clean()

Я предлагаю вам взглянуть на класс UpdateView [Django-doc] , так как это в основном то, что вы делаете здесь. Вы можете передать form_class, чтобы он работал в определенной форме.

...