2010-01-28 2 views
8

In ogni caso, per rendere un campo condizionalmente richiesto in base al fatto che sia stato compilato o meno un altro campo nello stesso modulo?Richiedere condizionatamente un solo campo nel modulo modello 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 

Non ho bisogno di alcuna soluzione javascript. Mi sento come dovrebbe essere risolto con le forme di django, ma non sono sicuro di quale sia il modo migliore per farlo.

metodo

risposta

5

È anche possibile eseguire questa operazione utilizzando il modello se si conosce la convalida si applicherà a tutti gli oggetti di questa classe . Per utilizzare il sotto a livello di modulo, utilizzare clean_data. Qui è un diritto di esempio da documentazione Django con 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() 

Riferimento: Model Instance Clean, Django Validators

Ecco un esempio di forme:

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 

Riferimento: Form & Field Validation

0

La soluzione migliore per il campo condizionalmente richiesto è quello di scavalcare il metodo pulito del modulo e far apparire l'erro a condizione. Per esempio:

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