django: BooleanField, wie setze ich den Standardwert auf true?

106

Ich benutze BooleanField in Django. Standardmäßig ist das von ihm generierte Kontrollkästchen deaktiviert. Ich möchte, dass der Status standardmäßig aktiviert ist. Wie geht das?

Bin Chen
quelle

Antworten:

184

Wenn Sie nur ein Vanilleformular (kein ModelForm) verwenden, können Sie einen Feldanfangswert festlegen ( https://docs.djangoproject.com/de/2.2/ref/forms/fields/#django.forms.Field). initial ) wie

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

Wenn Sie eine ModelForm verwenden, können Sie einen Standardwert für das Modellfeld festlegen ( https://docs.djangoproject.com/de/2.2/ref/models/fields/#default ), der für die resultierende ModelForm gilt , mögen

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

Wenn Sie zur Laufzeit dynamisch auswählen möchten, ob Ihr Feld standardmäßig ausgewählt werden soll, können Sie den Initialparameter für das Formular verwenden, wenn Sie es initialisieren :

form = MyForm(initial={'my_field':True})
Michael C. O'Connor
quelle
2
Danke form = MyForm(initial={'my_field':True}), ich habe es nicht sofort in der Dokumentation gefunden.
Paco
Diese Antwort ist eigentlich falsch : Anfangswert ist nicht Standard - Wert , wie in @DW erwähnt Antwort
fror
141
from django.db import models

class Foo(models.Model):
    any_field = models.BooleanField(default=True)
Vaibhav Sharma
quelle
1
Wo ist das dokumentiert? Es gibt Erwähnung initialin den Dokumenten (für ungebundene Form), aber nichtdefault
Benutzer
7
In dieser Antwort verwendet der Antwortende ein Modellfeld, kein Formularfeld. Hier liegt der Unterschied. Das hat mich gestolpert, weil ich es übersprungen habe, nur um das Standard-Kwarg zu sehen. Standard ist kein gültiges Formular. Form kwarg. Ich wollte das nur posten, um diese Antwort ein wenig zu klären, da sie 0 Kommentare enthält.
Josh Brown
Dies funktioniert nur für Formularmodellfelder. Außerdem ist das Ändern der Modellvorgabe, um die Initiale anders anzuzeigen, etwas schwierig, insbesondere wenn das Einstellen des Anfangswertes so einfach ist.
Guival
Initiale ist von älteren Django. docs.djangoproject.com/de/2.0/ref/models/fields/#booleanfield
Sharpless512
6

Ich benutze django == 1.11. Die Antwort, die die meisten Stimmen erhält, ist tatsächlich falsch. Beim Überprüfen des Dokuments von Django heißt es:

initial - Ein Wert, der in der Anfangsanzeige dieses Felds verwendet werden soll. Dieser Wert wird nicht als Fallback verwendet, wenn keine Daten angegeben werden.

Wenn Sie sich mit dem Code der Formularüberprüfung befassen, werden Sie feststellen, dass das Formular für jedes Feld das Widget aufruft value_from_datadict , um den tatsächlichen Wert zu erhalten. Dies ist also der Ort, an dem wir den Standardwert einfügen können.

Zu diesem BooleanFieldZweck können wir von CheckboxInputStandard value_from_datadictund initFunktion erben , diese überschreiben .

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)

Verwenden Sie dann dieses Widget beim Erstellen BooleanField.

class ExampleForm(forms.Form):
    bool_field = forms.BooleanField(widget=CheckboxInput(default=True), required=False)
DW
quelle
Gültig auch für Django 3.0. Vielen Dank.
Uhr eingefroren
0

In DJango 3.0 wird der Standardwert eines BooleanField in model.py folgendermaßen festgelegt:

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