我想验证我要更新TimesheetEntry
模型的表单。我想检查timesheet_clock_out_date
和timesheet_clock_out_time
是否不少于timesheet_clock_in_date
和timesheet_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)
我如何验证日期和时间。
答案 0 :(得分:3)
我想验证我要更新TimesheetEntry模型的表单。我要检查
timesheet_clock_out_date
和timesheet_clock_out_time
是否不少于timesheet_clock_in_date
和timesheet_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_date
为None
但不是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
使其以某种形式运行。