form.cleaned_data ignora los valores iniciales

Tengo el siguiente código de formulario:

class DisplaySharerForm(forms.Form):
    ORDER_BY_CHOICES = (
        ('customer_sharer_identifier', 'customer_sharer_identifier'),
        ('action_count', 'action_count'),
        ('redirect_link', 'redirect_link'),
        ('enabled', 'enabled'),
        ('click_total', 'click_total')
    )

    DIRECTION = (
        ('DESC','DESC'),
        ('ASC', 'ASC')
    )

    #These are the sorting options.  By default it's set to order by the customer_sharer_identifiers, descending, beginning at page 1.
    order_by = forms.ChoiceField(choices=ORDER_BY_CHOICES, required=False,initial='customer_sharer_identifier')
    direction = forms.ChoiceField(choices=DIRECTION, required=False,initial='DESC')
    action_type_id = forms.IntegerField(required=False)
    page_number = forms.IntegerField(required=False,initial=1)

Esto es lo que obtengo cuando intento crear un DisplaySharerForm usando los valores iniciales:

>>> f = DisplaySharerForm({})
>>> f.is_valid()
True
>>> f.cleaned_data
{'action_type_id': None, 'direction': u'', 'page_number': None, 'order_by': u'', 'customer_sharer_identifier': None}

¿Por qué no es cleaned_data se establece en los valores iniciales que proporcioné y ¿qué puedo hacer para solucionarlo?

preguntado el 30 de enero de 12 a las 19:01

1 Respuestas

cleaned_data devuelve los valores limpios de los datos vinculados al formulario. En este caso, ha enlazado y vacío el diccionario al formulario. los initial_data se utiliza para la visualización del formulario inicial y para ver qué valores han cambiado. Puede "arreglar" esto con una función de limpieza personalizada:

class DisplaySharerForm(forms.Form):
...
    def clean(self):
        cleaned_data = super(DisplaySharerForm, self).clean()
        for key, value in cleaned_data.items():
            if not value and key in self.initial:
                cleaned_data[key] = self.initial[key]
        return cleaned_data

Respondido el 30 de enero de 12 a las 23:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.