Aquí está la declaración de campo en un formulario:
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 3
y esto no parece funcionar. He jugado con el parámetro, comillas / sin comillas, etc. pero sin cambios.
¿Alguien podría darme una respuesta definitiva si es posible? ¿Y / o el ajuste necesario en mi fragmento de código?
Estoy usando Django 1.0
django
django-models
django-forms
thebiglife
fuente
fuente
Respuestas:
Intente establecer el valor inicial cuando cree una instancia del formulario:
fuente
'3'
Corresponde al primer valor de la tupla o al segundo?Esto no toca la pregunta inmediata en cuestión, pero esta Q / A surge para búsquedas relacionadas con tratar de asignar el valor seleccionado a un
ChoiceField
.Si ya ha llamado
super().__init__
en su clase Form, debe actualizar elform.initial
diccionario, no lafield.initial
propiedad. Si estudiaform.initial
(por ejemplo,print self.initial
después de la llamada asuper().__init__
), contendrá valores para todos los campos. Tener un valor deNone
en ese dict anulará elfield.initial
valor.p.ej
fuente
También puede hacer lo siguiente. en tu formulario class def:
luego, al llamar al formulario en su vista, puede establecer dinámicamente tanto las opciones iniciales como la lista de opciones.
Nota: los valores iniciales deben ser una lista y las opciones deben ser 2 tuplas, en mi ejemplo anterior tengo una lista de 2 tuplas. Espero que esto ayude.
fuente
initial
refiere a la clave del elemento a seleccionar, no a su índice. ¡Me tomó un par de intentos resolver esto!También me encontré con este problema y descubrí que el problema está en el navegador. Cuando actualiza, el navegador vuelve a llenar el formulario con los mismos valores que antes, ignorando el campo marcado. Si ve la fuente, verá que el valor marcado es correcto. O coloque el cursor en el campo URL de su navegador y presione enter. Eso volverá a cargar el formulario desde cero.
fuente
Las respuestas de Tom y Burton me funcionan eventualmente, pero tuve un pequeño problema para averiguar cómo aplicarlas a un
ModelChoiceField
.El único truco 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 del modelo inicial, debe pasar la ID del modelo como valor inicial, no el objeto en sí, su nombre o cualquier otra cosa. Entonces es tan simple como:Alternativamente, el
initial
argumento se puede ignorar en lugar de una línea adicional con:fuente
GET
solicitud y configurarlo desde una vista.Dave, ¿has tenido suerte para encontrar una solución al problema del navegador? ¿Hay alguna forma de forzar una actualización?
En cuanto al problema original, intente lo siguiente al inicializar el formulario:
fuente
Instances should always modify self.fields; they should not modify self.base_fields.
Para estar seguro, necesito ver cómo está renderizando el formulario. El valor inicial solo se usa de forma independiente, si está vinculado y no se incluye un valor para ese campo, no se seleccionará nada.
fuente
Prueba esto, funciona para mí, he agregado esto en models.py
fuente
TypeError at /my/url/ __init__() got an unexpected keyword argument 'default' Request Method: GET Request URL: http://localhost:8000/my/url/ Django Version: 1.8.1 Exception Type: TypeError Exception Value: __init__() got an unexpected keyword argument 'default'