使用数据库中的日期验证日期和时间-Django

时间:2019-01-18 13:11:23

标签: django django-models django-forms django-templates django-views

我想验证我要更新TimesheetEntry模型的表单。我想检查timesheet_clock_out_datetimesheet_clock_out_time是否不少于timesheet_clock_in_datetimesheet_clock_in_time。如果是,则提示错误“请输入正确的日期”。我在我的网址中发送primary key的{​​{1}}

urls.py

TimesheetEntry

Forms.py

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

Models.py

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

Views.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)

我如何验证日期和时间。

1 个答案:

答案 0 :(得分:3)

  

我想验证我要更新TimesheetEntry模型的表单。我要检查timesheet_clock_out_datetimesheet_clock_out_time是否不少于timesheet_clock_in_datetimesheet_clock_in_time

您可以添加一个clean(..) function [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 clean(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_dateNone但不是timesheet_clock_out_time的怪异情况,反之亦然。

通常情况下, not 不会以类的名称作为属性的前缀,因为这会提高 duck 键入的能力。

对此建模的更好方法是:

from django.core.exceptions import ValidationError

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

    def clean(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使其以某种形式运行。