2010-02-21 117 views
12

Soy nuevo en Django (y Python), y estoy tratando de averiguar cómo condicionalizar ciertos aspectos de la validación de formularios. En este caso, hay una interfaz HTML para la aplicación donde el usuario puede elegir una fecha y una hora desde los widgets. El método clean en el objeto de formulario toma los valores de los campos de hora y fecha y los convierte nuevamente en datetime.Validación de formulario de Django: ¿hacer condicional "requerido"?

Además de la interfaz HTML, también hay un cliente de iPhone realizar llamadas en la aplicación, y me gustaría pasar un valor de tiempo de estilo de marca de tiempo UNIX en

Mi código de formulario es el siguiente:.

class FooForm(forms.ModelForm): 
    foo_date    = forms.CharField(required=True, widget=forms.RadioSelect(choices=DATE_CHOICES)) 
    foo_time    = forms.CharField(required=True, widget=SelectTimeWidget()) 
    foo_timestamp  = forms.CharField(required=False) 

¿Cómo hago foo_date y foo_time requiere menosfoo_timestamp se proporciona?

Respuesta

21

Esto se hace con el método clean en el formulario. Debe establecer foo_date y foo_time en required=False, porque clean solo se invoca después de que se haya validado cada campo (consulte también documentation).

class FooForm(forms.Form) 
    # your field definitions 

    def clean(self): 
     data = self.cleaned_data 
     if data.get('foo_timestamp', None) or (data.get('foo_date', None) and data.get('foo_time', None)): 
      return data 
     else: 
      raise forms.ValidationError('Provide either a date and time or a timestamp') 
+0

Gracias, estaba pensando 'clean' era probablemente el lugar para hacer esto. ¿Es posible, sin embargo, tener el error de validación en los campos 'foo_date' y' foo_time', frente a un error de validación de formulario general? Gracias, Chris – ChrisW

+1

Eso se explica en el segundo ejemplo en los documentos que he vinculado a –

+0

self.RTFM; gracias, voy a cavar – ChrisW

8

me encontré que necesitan una manera "estándar" de hacer esto, ya que mis formas tienen varios campos necesarios con condiciones. Así que creé una superclase con el siguiente método:

def validate_required_field(self, cleaned_data, field_name, message="This field is required"): 
    if(field_name in cleaned_data and cleaned_data[field_name] is None): 
     self._errors[field_name] = self.error_class([message]) 
     del cleaned_data[field_name] 

Y luego en el método limpio de mi forma que tengo:

def clean(self): 
    cleaned_data = super(FormClass, self).clean() 
    if(condition): 
     self.validate_required_field(cleaned_data, 'field_name') 

Ha funcionado perfectamente para mí hasta ahora.

Cuestiones relacionadas