domingo 16 de octubre de 2011

Django: Ignorar validación de ChoiceField

Sucede que en Django, un  campo ChoiceField requiere que se le entregue una lista de las opciones a mostrar, las cuales se otorgan por medio del atributo choices.

from django.forms import ChoiceField
list_of_choices = (
    (1, 'Choice 1'),
    (2, 'Choice 2'),
    (3, 'Choice 3'),
    # ...
    (n, 'Choice n'),
)
class MyForm(forms.Form):
    my_choice_field = ChoiceField(choices = list_of_choices)

Entonces, cuando nosotros enviamos nuestra opción en el formulario, Django comprueba que sea una opción válida, pero existen situaciones en las que esta auto-validación no es lo que deseamos, por ejemplo, en caso de que usemos un 'Selector dinámico' que obtiene sus campos a través de Ajax.


En esta situación, lo que podemos hacer es crear un nuevo campo que herede de ChoiceField, pero que incluya una validación personalizada, sobre-escribiendo a la que viene por defecto, lo que nos quedaría de la siguiente manera:
from django.forms import ChoiceField

class LazyChoiceField(ChoiceField):
    def __init__(self, choices=(), required=True, widget=None,
                 label=None, initial=None, help_text=None,
                 *args, **kwargs):
        super(LazyChoiceField, self).__init__(required=required,
        widget=widget, label=label, initial=initial,
        help_text=help_text, *args, **kwargs)

    def valid_value(self, value):      
        # aqui va nuestra nueva validacion
        # en caso de ser correcta, retorna True
        return True

opciones = (
    (1, 'Choice 1'),
    (2, 'Choice 2'),
    (3, 'Choice 3'),
    # ...
    (n, 'Choice n'),
)

class MyForm(forms.Form):
    my_choice_field = LazyChoiceField(choices = opciones)

>> Visto en: ikraftsoft