2009-10-28 9 views
5

¿Cómo se requieren todos los formularios en el formset de django? Intenté validar la presencia de todos los campos en cleaned_data anulando el método clean() de formset pero simplemente falla silenciosamente sin que se muestre ningún error.Formularios Django necesarios

Gracias!

Código Fuente:

class BaseScheduleForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     super(BaseScheduleForm, self).__init__(*args, **kwargs) 
     self.fields['day'].widget = forms.HiddenInput() 
     self.fields['user'].widget = forms.HiddenInput() 

    class Meta: 
     model = Schedule 

    def clean_end_time(self): 
     start_time = self.cleaned_data.get('start_time') 
     end_time = self.cleaned_data['end_time'] 

     if start_time and end_time: 
      if end_time <= start_time: 
       raise forms.ValidationError("End time must be later that start time.") 
     return end_time 

class BaseScheduleFormset(forms.models.BaseModelFormSet): 

    def __init__(self, *args, **kwargs): 
     super(BaseScheduleFormset, self).__init__(*args, **kwargs) 
     for number, weekday in enumerate(WEEKDAYS): 
      self.forms[number].day_name = weekday[1] 

    def clean(self): 
     raise forms.ValidationError('You must specify schedule for the whole week') 

ScheduleFormset = forms.models.modelformset_factory(Schedule, extra=7, max_num=7, 
    form=BaseScheduleForm, formset=BaseScheduleFormset) 

Hay 7 formas cada uno para un día y todos ellos deben ser llenados para ser válida. En el ejemplo anterior, traté de generar un error de limpieza. is_valid() se convirtió en False, pero no se visualizó ningún error.

+0

Puede por favor dar más detalles y código fuente? – luc

Respuesta

0

Es un poco difícil de entender donde no se muestran los errores.

Si is_valid es False, entonces bueno, la validación está funcionando. Entonces, el siguiente lugar para mirar es la capa de plantillas. ¿Cómo está buscando errores? {{form.errors}} o {{somefield.errors}}.

La forma en que se configuran los métodos de limpieza aquí, sus errores no se asociarán con ningún campo, pero deberían ir en el todos erros slot.

Saludos

+0

formset.errors está vacío aunque formset.is_valid() es falso. Parece un error para mí. –

0

Tuve este mismo problema y di cuenta de que estos errores se almacenaron por el control de la fuente. Cuando anula el método de limpieza de un formset y genera un error de validación, los errores se almacenan en la propiedad non_form_errors.

Así que en su plantilla que tenga que añadir el siguiente supone que la variable plantilla para formset se llama 'juego de formularios':

{{ formset.non_form_errors }} 
Cuestiones relacionadas