2010-01-28 31 views
8

De todos modos, ¿se requiere condicionalmente un campo basado en si se completó o no otro campo en el mismo formulario?Condicionalmente se requiere solo un campo en el formulario Django

If field1 has no data, but field2 does 
    form is valid. 

If field1 has no data and field2 has no data 
    form is invalid 

No necesito ninguna solución javascript. Siento que debería resolverse con las formas django, pero no estoy seguro de cómo hacerlo.

método

Respuesta

5

También puede hacerlo utilizando el modelo si conoce la validación se aplicará a todos los objetos de esta clase . Para usar el siguiente en el nivel de formulario, use clean_data. Aquí es un derecho muestra a partir de la documentación de Django usando ValidationError:

class Article(models.Model): 

    status = models.CharField(max_length=75, blank=False, null=False) 
    pub_date = models.CharField(max_length=75, blank=False, null=False) 

    def clean(self): 
     # Don't allow draft entries to have a pub_date. 
     if self.status == 'draft' and self.pub_date is not None: 
      raise ValidationError('Draft entries may not have a publication date.') 
     # Set the pub_date for published items if it hasn't been set already. 
     if self.status == 'published' and self.pub_date is None: 
      self.pub_date = datetime.date.today() 

Referencia: Model Instance Clean, Django Validators

aquí es un ejemplo formas:

class SimpleForm(forms.ModelForm): 

    def clean(self): 
     cleaned_data = super(SimpleForm, self).clean() # Get the cleaned data from default clean, returns cleaned_data 
     field1 = cleaned_data.get("field1") 
     field2 = cleaned_data.get("field2"), 

     if not field1 and not field2: 
      raise forms.ValidationError('Please fill in both fields.') 

     return cleaned_data 

Referencia: Form & Field Validation

0

La mejor solución para el campo condicionalmente requerido es anular el método de limpieza de la forma y mostrar el erro r en condición. Por ejemplo:

clean(self): 
    if self.cleaned_data.get(some_field) == 1: 
     self.errors.pop(other_field, None) 
Cuestiones relacionadas