django: BooleanField, comment définir la valeur par défaut sur true?

107

J'utilise BooleanField dans django. Par défaut, la case à cocher générée par elle est un état décoché, je veux que l'état soit coché par défaut, comment faire?

Bin Chen
la source

Réponses:

184

Si vous utilisez simplement un formulaire vanille (pas un ModelForm), vous pouvez définir une valeur initiale Field ( https://docs.djangoproject.com/en/2.2/ref/forms/fields/#django.forms.Field. initial ) comme

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

Si vous utilisez un ModelForm, vous pouvez définir une valeur par défaut sur le champ de modèle ( https://docs.djangoproject.com/en/2.2/ref/models/fields/#default ), qui s'appliquera au ModelForm résultant , comme

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

Enfin, si vous souhaitez choisir dynamiquement à l'exécution si votre champ sera sélectionné par défaut ou non, vous pouvez utiliser le paramètre initial du formulaire lorsque vous l' initialisez :

form = MyForm(initial={'my_field':True})
Michael C. O'Connor
la source
2
Merci pour form = MyForm(initial={'my_field':True}), je ne l'ai pas trouvé tout de suite dans la documentation.
Paco
Cette réponse est en fait fausse : la valeur initiale n'est pas la valeur par défaut comme mentionné dans la réponse
@DW
142
from django.db import models

class Foo(models.Model):
    any_field = models.BooleanField(default=True)
vaibhav sharma
la source
1
Où est-ce documenté? Il y a une mention initialdans la documentation (pour la forme non liée), mais pasdefault
utilisateur
7
dans cette réponse, le répondant utilise un champ de modèle, pas un champ de formulaire. C'est là que réside la différence. Cela m'a fait trébucher parce que je l'ai sauté juste pour voir le kwarg par défaut. La valeur par défaut n'est pas un formulaire valide. Formulaire kwarg. Je voulais juste poster cela pour clarifier un peu cette réponse, car elle ne contient aucun commentaire.
Josh Brown
Cela ne fonctionne que pour les champs de modèle de formulaire. De plus, changer la valeur par défaut du modèle juste pour afficher l'initiale différemment est un peu trop, surtout lorsque la définition de la valeur initiale est si simple.
guival
l'initiale est de l'ancien Django. docs.djangoproject.com/en/2.0/ref/models/fields/#booleanfield
Sharpless512
6

J'utilise django == 1.11. La réponse à obtenir le plus de votes est en fait fausse. En vérifiant le document de django, il est dit:

initial - Une valeur à utiliser dans l'affichage initial de ce champ. Cette valeur n'est pas utilisée comme solution de secours si les données ne sont pas fournies.

Et si vous creusez dans le code du processus de validation du formulaire, vous constaterez que, pour chaque champ, le formulaire appellera son widget value_from_datadict pour obtenir la valeur réelle, c'est donc l'endroit où nous pouvons injecter la valeur par défaut.

Pour ce faire BooleanField, nous pouvons hériter de CheckboxInput, remplacer la valeur par défaut value_from_datadictet la initfonction.

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)

Utilisez ensuite ce widget lors de la création BooleanField.

class ExampleForm(forms.Form):
    bool_field = forms.BooleanField(widget=CheckboxInput(default=True), required=False)
DW
la source
Valable pour Django 3.0aussi. Merci.
gelé le
0

Dans DJango 3.0, la valeur par défaut d'un BooleanField dans model.py est définie comme ceci:

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