Я хочу проверить форму, в которой я обновляю модель 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
, чтобы он работал в определенной форме.