135 votes

Comment définir True comme valeur par défaut pour BooleanField dans Django ?

J'utilise BooleanField dans Django.

Par défaut, la case à cocher qu'il génère n'est pas cochée. Je veux que l'état soit coché par défaut. Comment dois-je procéder ?

229voto

Michael C. O'Connor Points 4462

Si vous n'utilisez qu'un formulaire classique (pas un ModelForm), vous pouvez définir la valeur initiale d'un champ ( 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 du modèle ( https://docs.djangoproject.com/en/2.2/ref/models/fields/#default ), qui s'appliqueront au ModelForm résultant, comme par exemple

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

Enfin, si vous souhaitez choisir dynamiquement, au moment de l'exécution, si votre champ sera sélectionné par défaut ou non, vous pouvez utiliser le paramètre initial du formulaire lors de l'exécution de l'opération. l'initialiser :

form = MyForm(initial={'my_field':True})

2 votes

Merci pour form = MyForm(initial={'my_field':True}) Je ne l'ai pas trouvé tout de suite dans la documentation.

1 votes

Cette réponse est en fait mauvais : initial valeur n'est pas par défaut valeur comme mentionné dans @D.W. respuesta

149voto

vaibhav sharma Points 521
from django.db import models

class Foo(models.Model):
    any_field = models.BooleanField(default=True)

1 votes

Où cela est-il documenté ? Il est fait mention de initial dans la documentation (pour les formulaires non liés), mais pas l'option default

8 votes

Dans cette réponse, le répondant utilise un champ modèle, et non un champ formulaire. C'est là que se trouve la différence. Cela m'a fait trébucher parce que j'ai sauté dessus juste pour voir le kwarg par défaut. Default n'est pas un kwarg valide de forms.Form. Je voulais juste poster cela pour clarifier un peu cette réponse, puisqu'elle n'a pas été commentée.

0 votes

Cela ne fonctionne que pour les champs du modèle de formulaire. De plus, modifier le modèle par défaut juste pour afficher la valeur initiale différemment est un peu trop, surtout lorsque la définition de la valeur initiale est si simple.

12voto

D.W Points 61

J'utilise django==1.11. La réponse qui a reçu 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 est no utilisé comme solution de repli 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 appelle sa fonction du widget value_from_datadict pour obtenir la valeur réelle, donc c'est l'endroit où nous pouvons injecter la valeur par défaut.

Pour ce faire, il faut BooleanField nous pouvons hériter de CheckboxInput , remplacer la valeur par défaut value_from_datadict y init fonction.

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 lorsque vous créez BooleanField .

class ExampleForm(forms.Form):
    bool_field = forms.BooleanField(widget=CheckboxInput(default=True), required=False)

4voto

Sajad Jalilian Points 28

J'ai trouvé que la façon la plus propre de le faire est la suivante.

Testé sur Django 3.1.5

class MyForm(forms.Form):
    my_boolean = forms.BooleanField(required=False, initial=True)

J'ai trouvé la réponse ici

3voto

VicenteC Points 101

Dans Django 3.0, la valeur par défaut d'un BooleanField dans le format model.py est réglé comme suit :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X