2009-03-18 26 views
83

Aquí está la declaración de campo en un formulario:Ajuste del valor seleccionado en un Django forms.ChoiceField

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 a ser 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.

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

Muchas gracias.

+0

Me he estado preguntando lo mismo. "initial" tampoco parece funcionar con opciones en la última versión de trunk. –

Respuesta

87

intentar aumentar el valor inicial cuando se instancia la forma:

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

¿'' ''3'''' corresponde al primer valor de la tupla o al segundo? – Bestasttung

+1

las tuplas representan (valor, etiqueta) pares para las opciones y usted desea especificar el valor inicial, por lo que el '3' se refiere al primer elemento. – Tom

1

Para estar seguro de que necesito ver cómo está procesando 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.

17

me encontré con este problema también, y dado cuenta de que el problema está 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.

+1

solo fyi, esto todavía sucede en FF6. Presionar el botón de actualización no es suficiente. Pero en el botón de actualización de google chrome es suficiente, no es necesario ir a la barra de direcciones – mhd

+1

. Creo que siempre sucederá en Firefox; es un comportamiento intencionado. – thepeer

3

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

En cuanto al problema original, pruebe lo siguiente en la inicialización del formulario:

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

Esto no se ve bien. Citado de django 1.3, forms.py:93: 'Las instancias siempre deben modificar self.fields; no deberían modificar self.base_fields.' – SummerBreeze

37

También puede hacer lo siguiente. en su formulario de la clase def:

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

entonces cuando se llama a la forma en que su vista se puede establecer dinámicamente ambas opciones iniciales y 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 tiene que ser una lista y las opciones que tiene que ser de 2-tuplas, en mi ejemplo anterior tengo una lista de 2-tuplas. Espero que esto ayude.

+3

Quizás vale la pena señalar que el valor de 'initial' se refiere a la clave del elemento que se va a seleccionar, no a su índice. Me tomó un par de intentos para resolver esto! – BigglesZX

5

Las dos respuestas de Tom y Burton finalmente me funcionan, pero me costó un poco encontrar la forma de aplicarlas a un ModelChoiceField.

El único truco para esto es que las opciones se almacenan como tuplas de (<model's ID>, <model's unicode repr>), por lo que si desea establecer la selección inicial del modelo, se pasa del modelo ID como el valor inicial, no el objeto en sí mismo o su nombre O algo más.Entonces es tan simple como:

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

Alternativamente, el argumento initial pueden ser ignorados en lugar de una línea adicional con:

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

Su segunda línea de código funciona a la perfección en uno de esos raros casos en los que necesita establecer el valor inicial de un formulario después de una solicitud 'GET' y establecerlo dentro de una vista. – kstratis

60

Esto no toca la cuestión inmediata en cuestión, pero esto Q/A aparece para las búsquedas relacionadas con intentar asignar el valor seleccionado a ChoiceField.

Si ya ha llamado super().__init__ en su clase Form, debe actualizar el diccionario form.initial, no la propiedad field.initial. Si estudia form.initial (por ejemplo, print self.initial después de la llamada al 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' 
+1

Gracias. Como dijiste, no está exactamente relacionado con el OP, ¡pero resolvió el problema por el que buscaba Google! – randlet

+0

¡Gracias por eso, me salvó de un poco de rasguños en la cabeza! – TimD

+2

si no entiende esta respuesta, lea esto [formulario de django gotchas] (http://www.avilpage.com/2015/03/django-form-gotchas-dynamic-initial.html) – ChillarAnand

-2

Prueba esto funciona para mí, he añadido esto en models.py

options = (
    ('1','1'), 
    ('2','2'), 
    ('3','3') 
) 

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

Esto dará un error en django 1.8.1: 'TypeError en/mi/url/ __init __() tiene un argumento de palabra clave inesperada 'por defecto' Solicitud Método: \t GET URL de solicitud: \t http: // localhost: 8000/mi/url/ Django Versión: 1.8.1 \t Excepción Tipo: \t TypeError Valor Excepción: \t __init __() tiene un argumento inesperado palabra clave 'default'' – juliocesar

Cuestiones relacionadas