django: BooleanField, ¿cómo establecer el valor predeterminado en verdadero?

107

Estoy usando BooleanField en django. De forma predeterminada, la casilla de verificación generada por él es un estado sin marcar, quiero que el estado esté marcado de forma predeterminada, ¿cómo hacerlo?

Bin Chen
fuente

Respuestas:

184

Si solo está utilizando un formulario básico (no un ModelForm), puede establecer un valor inicial de campo ( https://docs.djangoproject.com/en/2.2/ref/forms/fields/#django.forms.Field. inicial ) como

class MyForm(forms.Form):
    my_field = forms.BooleanField(initial=True)

Si está utilizando un ModelForm, puede establecer un valor predeterminado en el campo del modelo ( https://docs.djangoproject.com/en/2.2/ref/models/fields/#default ), que se aplicará al ModelForm resultante , me gusta

class MyModel(models.Model):
    my_field = models.BooleanField(default=True)

Finalmente, si desea elegir dinámicamente en tiempo de ejecución si su campo se seleccionará o no de forma predeterminada, puede usar el parámetro inicial del formulario cuando lo inicialice :

form = MyForm(initial={'my_field':True})
Michael C. O'Connor
fuente
2
Gracias form = MyForm(initial={'my_field':True}), no lo encontré de inmediato en la documentación.
Paco
Esta respuesta es realmente incorrecta : el valor inicial no es el valor predeterminado como se menciona en la respuesta de
congelado
142
from django.db import models

class Foo(models.Model):
    any_field = models.BooleanField(default=True)
vaibhav sharma
fuente
1
¿Dónde está documentado esto? Se menciona initialen los documentos (para el formulario independiente), pero nodefault
usuario
7
en esta respuesta, el que responde está usando un campo modelo, no un campo de formulario. Ahí es donde está la diferencia. Esto me hizo tropezar porque lo salté solo para ver el kwarg predeterminado. El valor predeterminado no es un formulario válido. Formulario kwarg. Solo quería publicar eso para aclarar un poco esta respuesta, ya que tiene 0 comentarios.
Josh Brown
Esto solo funciona para campos de modelo de formulario. Además, cambiar el modelo predeterminado solo para mostrar la inicial de manera diferente es un poco excesivo, especialmente cuando establecer el valor inicial es tan simple.
guival
La inicial es de Django anterior. docs.djangoproject.com/en/2.0/ref/models/fields/#booleanfield
Sharpless
6

Estoy usando django == 1.11. La respuesta que obtiene la mayor cantidad de votos es realmente incorrecta. Verificando el documento de django, dice:

inicial: un valor para usar en la pantalla inicial de este campo. Este valor no se utiliza como respaldo si no se proporcionan datos.

Y si profundiza en el código del proceso de validación del formulario, encontrará que, para cada campo, el formulario llamará a su widget value_from_datadict para obtener el valor real, por lo que este es el lugar donde podemos inyectar el valor predeterminado.

Para hacer esto BooleanField, podemos heredar CheckboxInput, anular el valor predeterminado value_from_datadicty la initfunción.

class CheckboxInput(forms.CheckboxInput):
    def __init__(self, default=False, *args, **kwargs):
        super(CheckboxInput, self).__init__(*args, **kwargs)
        self.default = default

    def value_from_datadict(self, data, files, name):
        if name not in data:
            return self.default
        return super(CheckboxInput, self).value_from_datadict(data, files, name)

Luego use este widget al crear BooleanField.

class ExampleForm(forms.Form):
    bool_field = forms.BooleanField(widget=CheckboxInput(default=True), required=False)
DW
fuente
Válido para Django 3.0también. Gracias.
congelado
0

En DJango 3.0, el valor predeterminado de un BooleanField en model.py se establece así:

class model_name(models.Model):
example_name = models.BooleanField(default=False)
VicenteC
fuente