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 para ser 3 y esto no parece funcionar. He jugado con el param, citas/citas no, etc… pero no hay cambio.

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

Estoy usando Django 1.0

  • Me he estado preguntando la misma cosa. «inicial» no de costura para trabajar con opciones en la última tronco versión así.
InformationsquelleAutor thebiglife | 2009-03-18

8 Comentarios

  1. 107

    Pruebe a establecer el valor inicial cuando se crea la instancia de la forma:

    form = MyForm(initial={'max_number': '3'})
    • Es '3' correspondiente al primer valor de la tupla o el segundo?
    • las tuplas que representan (valor de la etiqueta) pares de las opciones y desea especificar el valor inicial – por lo que el ‘3’ se refiere al primer elemento.
  2. 83

    Este no toque la pregunta inmediata a mano, pero esto Q/A viene para las búsquedas relacionadas para tratar de asignar el valor seleccionado para un ChoiceField.

    Si ya han llamado super().__init__ en la clase de Formulario, usted debe actualizar el form.initial diccionario, no la field.initial de la propiedad. Si vas a estudiar form.initial (por ejemplo, print self.initial después de la llamada a super().__init__), que contendrá los valores de todos los campos. Tener un valor de None en que se dict anulará la field.initial valor.

    por ejemplo,

    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'
    • Gracias. Como usted dijo, no es exactamente relacionados con el OP, pero resolvió el problema estaba googleando para!
    • Gracias por eso, me salvó de un poco de dolores de cabeza!
    • si usted no entiende esta respuesta, lea este django forma trampas
    • Las 4 últimas líneas de su código salvó mi día! Muchas gracias hecho, y en mi humilde opinión esta es la forma «limpia» para ir!!
    • Gracias, me salvaste el día!
    • No estoy seguro de si es porque esta respuesta es tan viejo que ya no funciona, pero yo soy incapaz de hacer que esta solución de trabajo. He intentado todas las combinaciones de los anteriores y todavía no tengo amor. Me han hecho esta pregunta de nuevo aquí: stackoverflow.com/questions/52191096/… Si la respuesta sigue siendo la misma, por favor, hágamelo saber lo que está mal con mi código. Gracias!

  3. 39

    Usted también puede hacer lo siguiente. en la clase de formulario def:

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

    a continuación, cuando se llama a la forma en que su vista puede establecer dinámicamente tanto inicial de opciones y 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 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.

    • Quizás vale la pena señalar que el valor de initial se refiere a la clave del elemento seleccionado, no de su índice. Me tomó un par de intentos para resolver esto!
  4. 18

    Me encontré con este problema, y descubrió que el problema está en el navegador. Al actualizar el navegador se vuelve a rellenar el formulario con los mismos valores que antes, ignorando la comprobación de campo. Si usted origen de la vista, podrás ver el valor activado es correcta. O coloque el cursor en el campo URL del navegador y pulsa enter. Que se vuelva a cargar el formulario desde cero.

    • sólo para tu información, Esto todavía sucede en FF6. Pulsando el botón de actualización no es suficiente. Pero en google chrome botón actualizar es suficiente, no hay necesidad de ir a la barra de direcciones
    • Creo que siempre va a pasar en Firefox; es la intención de comportamiento.
  5. 6

    Tanto Tom y Burton respuestas a trabajar para mí, pero tuve un poco de problemas para averiguar cómo aplicarlos a un ModelChoiceField.

    El único truco es que las opciones son almacenados como tuplas de (<model's ID>, <model's unicode repr>), así que si usted desea establecer el modelo inicial de selección, se pasa del modelo ID como el valor inicial, no el objeto en sí mismo o en su nombre o cualquier otra cosa. Entonces es tan simple como:

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

    Alternativamente, la initial argumento puede ser ignorado en lugar de una línea adicional con:

    form.fields['manager'].initial = manager_employee_id
    • La segunda línea de código funciona a la perfección en uno de esos raros casos donde es necesario establecer una forma del valor inicial después de un GET solicitud y la puso dentro de una vista.
  6. 3

    Dave – cualquier suerte de encontrar una solución para el problema con el navegador? Es allí una manera de forzar una actualización?

    Como para el problema original, intente lo siguiente cuando se inicializa el formulario:

    def __init__(self, *args, **kwargs):
      super(MyForm, self).__init__(*args, **kwargs)   
      self.base_fields['MyChoiceField'].initial = initial_value
    • Esto no se ve muy bien. Citado de django 1.3, formas.py:93: Instances should always modify self.fields; they should not modify self.base_fields.
  7. 1

    Para estar seguro de que tengo que ver cómo procesar el formulario. El valor inicial, sólo se utiliza en un formulario independiente, si es obligado y un valor para ese campo no se incluye nada va a ser seleccionado.

  8. -3

    Tratar de esto, a mí me funciona, he añadido esta en models.py

    options = (
        ('1','1'),
        ('2','2'),
        ('3','3')
    )
    
    max_number = forms.ChoiceField(max_length = 2, choices = options, default ='3')
    • Esta dará un error en django 1.8.1: 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'

Dejar respuesta

Please enter your comment!
Please enter your name here