django: BooleanField, bagaimana cara menyetel nilai default ke true?

107

Saya menggunakan BooleanField di django. Secara default kotak centang yang dihasilkan olehnya adalah status tidak dicentang, saya ingin status dicentang secara default, bagaimana melakukannya?

Bin Chen
sumber

Jawaban:

184

Jika Anda hanya menggunakan formulir vanilla (bukan ModelForm), Anda dapat menyetel nilai awal Bidang ( https://docs.djangoproject.com/en/2.2/ref/forms/fields/#django.forms.Field. awal ) seperti

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

Jika Anda menggunakan ModelForm, Anda dapat menyetel nilai default pada bidang model ( https://docs.djangoproject.com/en/2.2/ref/models/fields/#default ), yang akan diterapkan ke ModelForm yang dihasilkan , Suka

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

Terakhir, jika Anda ingin secara dinamis memilih pada waktu proses apakah bidang Anda akan dipilih secara default atau tidak, Anda dapat menggunakan parameter awal ke formulir saat Anda menginisialisasinya :

form = MyForm(initial={'my_field':True})
Michael C. O'Connor
sumber
2
Terima kasih form = MyForm(initial={'my_field':True}), saya tidak langsung menemukannya di dokumentasi.
Paco
Jawaban ini sebenarnya salah : nilai awal bukanlah nilai default seperti yang disebutkan dalam jawaban
dibekukan
142
from django.db import models

class Foo(models.Model):
    any_field = models.BooleanField(default=True)
vaibhav sharma
sumber
1
Dimana ini didokumentasikan? Ada yang disebutkan initialdi dokumen (untuk formulir tidak terikat), tetapi tidakdefault
pengguna
7
dalam jawaban ini, penjawab menggunakan kolom model, bukan kolom formulir. Di situlah perbedaannya. Ini membuat saya tersandung karena saya melewatkannya hanya untuk melihat kwarg default. Default bukanlah formulir yang valid. Formulir kwarg. Hanya ingin memposting itu untuk sedikit menghapus jawaban ini, karena ada 0 komentar untuk itu.
Josh Brown
Ini hanya berfungsi untuk bidang model formulir. Selain itu, mengubah default model hanya untuk menampilkan awal secara berbeda sedikit banyak, khususnya saat menyetel nilai awal sangatlah sederhana.
guival
inisial dari Django lama. docs.djangoproject.com/en/2.0/ref/models/fields/#booleanfield
Sharpless512
6

Saya menggunakan django == 1.11. Jawaban mendapatkan suara terbanyak sebenarnya salah. Memeriksa dokumen dari django, dikatakan:

inisial - Nilai yang akan digunakan dalam tampilan awal Bidang ini. Nilai ini tidak digunakan sebagai fallback jika data tidak diberikan.

Dan jika Anda menggali kode proses validasi formulir, Anda akan menemukan bahwa, untuk setiap bidang, formulir akan memanggilnya widget value_from_datadict untuk mendapatkan nilai sebenarnya, jadi di sinilah kita dapat memasukkan nilai default.

Untuk melakukan ini BooleanField, kita dapat mewarisi from CheckboxInput, override default value_from_datadictdan initfunction.

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)

Kemudian gunakan widget ini saat membuat BooleanField.

class ExampleForm(forms.Form):
    bool_field = forms.BooleanField(widget=CheckboxInput(default=True), required=False)
DW
sumber
Berlaku Django 3.0juga. Terima kasih.
dibekukan
0

Di DJango 3.0 nilai default dari BooleanField di model.py disetel seperti ini:

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