django: BooleanField, jak ustawić domyślną wartość na true?

107

Używam BooleanField w django. Domyślnie generowany przez niego checkbox jest stanem niezaznaczonym, chcę aby stan był domyślnie zaznaczony, jak to zrobić?

Bin Chen
źródło

Odpowiedzi:

185

Jeśli używasz tylko formularza waniliowego (a nie ModelForm), możesz ustawić wartość początkową pola ( https://docs.djangoproject.com/en/2.2/ref/forms/fields/#django.forms.Field. początkowe ) jak

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

Jeśli używasz ModelForm, możesz ustawić domyślną wartość w polu modelu ( https://docs.djangoproject.com/en/2.2/ref/models/fields/#default ), która zostanie zastosowana do wynikowego ModelForm , lubić

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

Na koniec, jeśli chcesz dynamicznie wybierać w czasie wykonywania, czy twoje pole będzie domyślnie zaznaczone, czy nie, możesz użyć początkowego parametru do formularza podczas jego inicjalizacji :

form = MyForm(initial={'my_field':True})
Michael C. O'Connor
źródło
2
Dzięki za form = MyForm(initial={'my_field':True}), nie znalazłem tego od razu w dokumentacji.
Paco
Ta odpowiedź jest w rzeczywistości błędna : wartość początkowa nie jest wartością domyślną, jak wspomniano w odpowiedzi
zamrożona
142
from django.db import models

class Foo(models.Model):
    any_field = models.BooleanField(default=True)
vaibhav sharma
źródło
1
Gdzie to jest udokumentowane? W dokumentach jest wzmianka o initial(dla niezwiązanego formularza), ale niedefault
użytkownik
7
w tej odpowiedzi osoba odpowiadająca używa pola modelu, a nie pola formularza. Na tym polega różnica. To mnie zaskoczyło, ponieważ pominąłem to, aby zobaczyć domyślny kwarg. Wartość domyślna nie jest prawidłowym formularzem.Form kwarg. Chciałem tylko to opublikować, aby trochę wyjaśnić tę odpowiedź, ponieważ ma do niej komentarz 0.
Josh Brown
Działa to tylko w przypadku pól modelu formularza. Ponadto zmiana domyślnego modelu tylko po to, aby wyświetlić inicjał w inny sposób, to trochę dużo, zwłaszcza gdy ustawienie wartości początkowej jest tak proste.
guival
Początek pochodzi ze starszego Django. docs.djangoproject.com/en/2.0/ref/models/fields/#booleanfield
Sharpless512
6

Używam django == 1.11. Odpowiedź, która uzyskała najwięcej głosów, jest w rzeczywistości błędna. Sprawdzając dokument z django, mówi:

początkowa - wartość do użycia w początkowym wyświetlaniu tego pola. Ta wartość nie jest używana jako rezerwa, jeśli nie podano danych.

A jeśli zagłębisz się w kod procesu walidacji formularza, zobaczysz, że dla każdego pola formularz będzie wywoływał swoje widżety, value_from_datadict aby uzyskać rzeczywistą wartość, więc jest to miejsce, w którym możemy wstrzyknąć domyślną wartość.

Aby to zrobić BooleanField, możemy dziedziczyć po CheckboxInput, przesłonić domyślne value_from_datadicti initfunkcję.

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)

Następnie użyj tego widżetu podczas tworzenia BooleanField.

class ExampleForm(forms.Form):
    bool_field = forms.BooleanField(widget=CheckboxInput(default=True), required=False)
DW
źródło
Dotyczy Django 3.0też. Dzięki.
zamrożone
0

W DJango 3.0 domyślna wartość BooleanField w model.py jest ustawiona w następujący sposób:

class model_name(models.Model):
example_name = models.BooleanField(default=False)
VicenteC
źródło