Tengo un problema con el método clean()
de un modelo y la validación básica del campo. aquí está mi modelo y el método clean()
.método clean() en validación de modelo y campo
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')
Mis clean()
método comprueba si ciertos valores están en el rango correcto. Si el usuario olvida completar un campo, p. movement_start
, entonces me da un error:
can't compare datetime.timedelta to NoneType
me sorprende que me sale este error, ya que la función original clean()
debe ponerse al que falta la entrada (después de todo movement_start
es un campo obligatorio). Entonces, ¿cómo puedo hacer una verificación básica de los valores perdidos, y mi verificación personalizada si los valores están en ciertos rangos? ¿Se puede hacer esto con el método clean()
de la modelo, o necesito usar Forms
?
EDIT1 a hacer más claro: trial_start
, movement_start
y trial_stop
son todos los campos requeridos. Necesito escribir un método clean()
que compruebe primero que se hayan completado los tres campos y luego, verifique si los valores están en un cierto rango.
El siguiente código, por ejemplo, NO funciona, ya que trial_start
podría estar vacío. Quiero evitar tener que verificar la existencia de cada campo; django debería hacer eso por mí.
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 La razón por la que quería añadir este control con el método del modelo clean()
es que los objetos que se crean en el intérprete de Python, automáticamente serán comprobados por los valores correctos. Un formulario estará bien para las vistas, pero necesito la verificación de valor también para el shell.
Añadir 'blank = false' para hacer campos obligatorios. –
@BurhanKhalid los campos son obligatorios. 'blank = False' es el valor predeterminado. – memyself
@JonasGeiregat, entonces debería usar 'Forms' en su lugar? – memyself