我对模型的clean()
方法和基本字段验证有疑问。这是我的模型和clean()
方法。
class Trial(models.Model):
trial_start = DurationField()
movement_start = DurationField()
trial_stop = DurationField()
def clean(self):
from django.core.exceptions import ValidationError
if not (self.movement_start >= self.trial_start):
raise ValidationError('movement start must be >= trial start')
if not (self.trial_stop >= self.movement_start):
raise ValidationError('trial stop must be >= movement start')
if not (self.trial_stop > self.trial_start):
raise ValidationError('trial stop must be > trial start')
我的clean()
方法检查某些值是否在正确的范围内。如果用户忘记填写一个字段,例如movement_start
,那么我会收到一个错误:
can't compare datetime.timedelta to NoneType
我很惊讶我得到了这个错误,因为原始clean()
函数应该捕获那个丢失的条目(毕竟movement_start
是一个必填字段)。那么如何基本检查缺失值,以及我的自定义检查值是否在特定范围内?这可以用模型的clean()
方法完成,还是我需要使用Forms
?
EDIT1使其更清楚:trial_start
和movement_start
都是trial_stop
必填字段。我需要编写一个clean()
方法,首先检查所有三个字段是否都已填写,然后检查值是否在一定范围内。
例如,以下代码不起作用,因为trial_start
可能为空。我想避免检查每个字段的存在 - django 应该为我做这件事。
class TrialForm(ModelForm):
class Meta:
model = Trial
def clean_movement_start(self):
movement_start = self.cleaned_data["movement_start"]
trial_start = self.cleaned_data["trial_start"]
if not (movement_start >= trial_start):
raise forms.ValidationError('movement start must be >= trial start')
return self.cleaned_data["movement_start"]
EDIT2 我想将此检查添加到模型clean()
方法的原因是在 python shell 上创建的对象将自动检查正确的值。表单可以用于视图,但我也需要对 shell 进行值检查。