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ć?

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})

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)

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


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)

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)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.