2011-03-13 9 views
8

Quiero que mi ChoiceField en ModelForm tenga una opción en blanco (------) pero es obligatorio.Opción en blanco en ChoiceField requerido

Necesito tener una opción en blanco para evitar que el usuario salte accidentalmente el campo, por lo tanto, seleccione la opción incorrecta.

Respuesta

18

Esto funciona para al menos 1.4 y posteriores:

CHOICES = (
    ('', '-----------'), 
    ('foo', 'Foo') 
) 

class FooForm(forms.Form): 
    foo = forms.ChoiceField(choices=CHOICES) 

Desde ChoiceField se requiere (por defecto), que se quejan de estar vacío cuando se selecciona la primera opción, y lo haría si no segundos.

Es mejor hacerlo así que en la forma en que Yuji Tomita mostró, porque de esta forma se usan los mensajes de validación localizados de Django.

+0

Este es una buena idea, y evita escribir algún validador personalizado. –

-2

en el argumento añadir nula = True

como esto

gender = models.CharField(max_length=1, null = True) 

http://docs.djangoproject.com/en/dev/ref/models/fields/


por su comentario

THEME_CHOICES = (
    ('--', '-----'), 
    ('DR', 'Domain_registery'), 
) 
    theme = models.CharField(max_length=2, choices=THEME_CHOICES) 
+0

¿No es eso para el campo opcional? Quiero que sea obligatorio pero no tenga un valor predeterminado. – willwill

+0

THEME_CHOICES = ( ('-', '-----), (' DR', 'Domain_registery'), ) tema = models.CharField (MAX_LENGTH = 2, opciones = THEME_CHOICES) – Efazati

6

Se podía validar el campo con 012.

CHOICES = (
    ('------------','-----------'), # first field is invalid. 
    ('Foo', 'Foo') 
) 
class FooForm(forms.Form): 
    foo = forms.ChoiceField(choices=CHOICES) 

    def clean_foo(self): 
     data = self.cleaned_data.get('foo') 
     if data == self.fields['foo'].choices[0][0]: 
      raise forms.ValidationError('This field is required') 
     return data 

Si es un ModelChoiceField, se puede suministrar el argumento empty_label.

foo = forms.ModelChoiceField(queryset=Foo.objects.all(), 
        empty_label="-------------") 

Esto mantendrá la forma requerida, y si se selecciona -----, arrojará un error de validación.

0

También puede anular el método __init__() del formulario y modificar el atributo de campo choices, reasignando una nueva lista de tuplas. (Esto puede ser útil para cambios dinámicos):

def __init__(self, *args, **kwargs): 
    super(MyForm, self).__init__(*args, **kwargs) 
    self.fields['my_field'].choices = [('', '---------')] + self.fields['my_field'].choices 
Cuestiones relacionadas