Establecer el valor seleccionado en un Django forms.ChoiceField

Aquí está la statement de campo en una forma:

max_number = forms.ChoiceField(widget = forms.Select(), choices = ([('1','1'), ('2','2'),('3','3'), ]), initial='3', required = True,) 

Me gustaría establecer el valor inicial en 3 y esto no parece funcionar. He jugado con el param, citas / sin comillas, etc … pero sin cambios.

Algunos resultados que he encontrado a través de Google sugieren que es posible establecer el valor inicial, pero nunca he logrado que funcione. Estoy en django 1.0 por cierto.

¿Podría alguien darme una respuesta definitiva si es posible? ¿Y / o el ajuste necesario en mi fragmento de código?

Muchas gracias.

Intente establecer el valor inicial cuando crea una instancia del formulario:

 form = MyForm(initial={'max_number': '3'}) 

Esto no toca la pregunta inmediata en cuestión, pero esta pregunta surge para las búsquedas relacionadas con intentar asignar el valor seleccionado a un campo ChoiceField .

Si ya ha llamado a super().__init__ en su clase de formulario, debe actualizar el diccionario de form.initial , no la propiedad de field.initial . Si estudia form.initial (por ejemplo, print self.initial después de la llamada a super().__init__ ), contendrá valores para todos los campos. Tener un valor de None en ese dict anulará el valor field.initial .

p.ej

 class MyForm(forms.Form): def __init__(self, *args, **kwargs): super(MyForm, self).__init__(*args, **kwargs) # assign a (computed, I assume) default value to the choice field self.initial['choices_field_name'] = 'default value' # you should NOT do this: self.fields['choices_field_name'].initial = 'default value' 

También puedes hacer lo siguiente. en su clase de forma def:

 max_number = forms.ChoiceField(widget = forms.Select(), choices = ([('1','1'), ('2','2'),('3','3'), ]), initial='3', required = True,) 

luego, al llamar al formulario en su vista, puede establecer dinámicamente tanto las opciones iniciales como la lista de opciones.

 yourFormInstance = YourFormClass() yourFormInstance.fields['max_number'].choices = [(1,1),(2,2),(3,3)] yourFormInstance.fields['max_number'].initial = [1] 

Nota: los valores iniciales tienen que ser una lista y las opciones deben ser 2-tuplas, en mi ejemplo anterior, tengo una lista de 2-tuplas. Espero que esto ayude.

También encontré este problema y me di cuenta de que el problema estaba en el navegador. Cuando actualice, el navegador volverá a llenar el formulario con los mismos valores que antes, haciendo caso omiso del campo marcado. Si ve el código fuente, verá que el valor verificado es correcto. O coloque el cursor en el campo URL de su navegador y presione enter. Eso volverá a cargar el formulario desde cero.

Las respuestas de Tom y Burton finalmente me funcionan, pero me ModelChoiceField un poco descifrar cómo aplicarlas a ModelChoiceField .

El único truco es que las opciones se almacenan como tuplas de (, ) , por lo que si desea establecer la selección del modelo inicial, pase el ID del modelo como el valor inicial, no el objeto en sí o su nombre o cualquier otra cosa. Entonces es tan simple como:

 form = EmployeeForm(initial={'manager': manager_employee_id}) 

Alternativamente, el argumento initial se puede ignorar en lugar de una línea adicional con:

 form.fields['manager'].initial = manager_employee_id 

Dave: ¿hay suerte de encontrar una solución al problema del navegador? ¿Hay alguna manera de forzar una actualización?

En cuanto al problema original, intente lo siguiente al inicializar el formulario:

 def __init__(self, *args, **kwargs): super(MyForm, self).__init__(*args, **kwargs) self.base_fields['MyChoiceField'].initial = initial_value 

Para estar seguro de que necesito ver cómo estás renderizando el formulario. El valor inicial solo se usa en una forma independiente, si está vinculado y no se incluye un valor para ese campo, no se seleccionará nada.

Prueba esto, me funciona, lo he agregado en models.py

 options = ( ('1','1'), ('2','2'), ('3','3') ) max_number = forms.ChoiceField(max_length = 2, choices = options, default ='3')