ChatGPT解决这个技术问题 Extra ChatGPT

How to set True as default value for BooleanField on Django?

I am using BooleanField in Django.

By default, the checkbox generated by it is unchecked state. I want the state to be checked by default. How do I do that?


u
user8193706

If you're just using a vanilla form (not a ModelForm), you can set a Field initial value ( https://docs.djangoproject.com/en/2.2/ref/forms/fields/#django.forms.Field.initial ) like

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

If you're using a ModelForm, you can set a default value on the model field ( https://docs.djangoproject.com/en/2.2/ref/models/fields/#default ), which will apply to the resulting ModelForm, like

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

Finally, if you want to dynamically choose at runtime whether or not your field will be selected by default, you can use the initial parameter to the form when you initialize it:

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

Thanks for form = MyForm(initial={'my_field':True}), I didn't find it straight away in the documentation.
This answer is actually wrong : initial value is not default value as mentioned in @D.W. answer
G
Gabi Purcaru
from django.db import models

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

Where is this documented? There's mention of initial in the docs (for unbound form), but not default
in this answer, the answerer is using a model field, not a form field. That's where the difference is. This tripped me up because I skipped over it just to see the default kwarg. Default isn't a valid forms.Form kwarg. Just wanted to post that to clear this answer up a little, since it has 0 commentary to it.
This only works for form model fields. Also, changing the model default just to display the initial differently is a bit much, specially when setting the initial value is so simple.
D
D.W

I am using django==1.11. The answer get the most vote is actually wrong. Checking the document from django, it says:

initial -- A value to use in this Field's initial display. This value is not used as a fallback if data isn't given.

And if you dig into the code of form validation process, you will find that, for each fields, form will call it's widget's value_from_datadict to get actual value, so this is the place where we can inject default value.

To do this for BooleanField, we can inherit from CheckboxInput, override default value_from_datadict and init function.

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)

Then use this widget when creating BooleanField.

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

Valid for Django 3.0 too. Thanks.
A
Aurélien

In Django 3.0 the default value of a BooleanField in model.py is set like this:

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

S
Sajad Jalilian

I found the cleanest way of doing it is this.

Tested on Django 3.1.5

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

I found the answer here


R
Ricardo Vilaça

Both initial and default properties were not working for me, if that's your case try this:

class MyForm(forms.ModelForm):
    validated = forms.BooleanField()

    class Meta:
        model = MyModel
        fields = '__all__'

    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)

        self.fields['validated'].widget.attrs['checked'] = True

L
Leotrim Lota

Another way to check the default state in BooleanField is:

   active = forms.BooleanField(
    widget=forms.CheckboxInput(
        attrs={
            'checked': True
        }
    )
  )