如何在Django中将True设置为BooleanField的默认值?

133

我在Django中使用BooleanField

默认情况下,它生成的复选框处于未选中状态。我想要默认情况下处于选中状态。我怎么做?

9个回答

225

如果您只是使用普通表单(而不是ModelForm),您可以设置字段的初始值(https://docs.djangoproject.com/en/2.2/ref/forms/fields/#django.forms.Field.initial),例如:

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

如果您正在使用ModelForm,可以在模型字段上设置默认值 (https://docs.djangoproject.com/en/2.2/ref/models/fields/#default),这将应用于生成的ModelForm中,例如:

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

如果你想在运行时动态选择是否默认选中字段,可以在初始化表单时使用表单的initial参数:

初始化表单

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

2
感谢form = MyForm(initial={'my_field':True}),我在文档中没有立刻找到它。 - Paco
1
这个答案实际上是错误的:initial 值并不是 @D.W. 回答 中提到的默认值。 - freezed

149
from django.db import models

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

1
这个在哪里有记录?文档中提到了 initial(对于未绑定表单),但没有提到 default - user
8
在这个回答中,回答者正在使用一个模型字段而不是表单字段。这就是区别所在。这让我困惑了,因为我跳过了它,只是想看一下默认的kwarg。默认值不是一个有效的forms.Form kwarg。我只是想发布这个信息来澄清这个答案,因为它没有任何评论。 - Josh Brown
这仅适用于表单模型字段。而且,仅为了以不同的方式显示初始值而更改模型默认值有点过分,特别是当设置初始值如此简单时。 - gdvalderrama
以下是关于旧版Django中BooleanField的文档链接: https://docs.djangoproject.com/en/2.0/ref/models/fields/#booleanfield - Sharpless512

11

我正在使用django==1.11。获得最多赞的答案实际上是错误的。从django的文档中可以看到:

initial -- 用于此字段初始显示的值。如果未提供数据,则不会使用此值作为回退。

如果您深入了解表单验证过程的代码,您将发现对于每个字段,表单会调用其小部件(widget)value_from_datadict来获取实际值,因此这是我们可以注入默认值的地方。

要为BooleanField执行此操作,我们可以继承自CheckboxInput,重写默认的value_from_datadictinit函数。

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)

在创建BooleanField时,请使用此小部件。

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

1
同样适用于 Django 3.0。谢谢。 - freezed

4
我发现最干净的做法是这样的。
在 Django 3.1.5 上进行了测试。
class MyForm(forms.Form):
    my_boolean = forms.BooleanField(required=False, initial=True)

我在这里找到了答案


3
在Django 3.0中,model.py中的BooleanField字段默认值设置为:
class model_name(models.Model):
    example_name = models.BooleanField(default=False)

1
另一种检查BooleanField默认状态的方法是:
   active = forms.BooleanField(
    widget=forms.CheckboxInput(
        attrs={
            'checked': True
        }
    )
  )

0

我尝试更改BooleanField的初始值:

def __init__(self, *args, **kwargs):
    super(UserConfirmForm,self).__init__(*args, **kwargs)
    self.fields['bool_field'].initial = True

但是它没有起作用。

我的解决方案:

def __init__(self, *args, **kwargs):
    kwargs['initial'] = {'bool_field': True}
    super(UserConfirmForm,self).__init__(*args, **kwargs)

它的工作原理如下:

UserConfirmForm(initial={'bool_field':True})

但我们无法在通用编辑视图中调用表单。 我认为这是常规调用表单对象的一个很好的替代方案。


0

如果下面 models.BooleanField() 中的 default=Truemodels.py 中无法使用:

# "models.py"

class MyModel(models.Model):   # Here
    state = models.BooleanField(default=True)

然后,在admin.py中使用以下解决方案:

# "admin.py"

class MyModelForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        kwargs['initial'] = {'state': True}
        super().__init__(*args, **kwargs)

@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
    form = MyModelForm

或者:

# "admin.py"

class MyModelForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['state'].widget.attrs['checked'] = True

@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
    form = MyModelForm

或者:

# "admin.py"

class MyModelForm(forms.ModelForm):
    state = forms.BooleanField(initial=True, required=False)

@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
    form = MyModelForm

或者:

# "admin.py"

class MyModelForm(forms.ModelForm):
    state = forms.BooleanField(
        widget=forms.CheckboxInput(
            attrs={
                'checked': True
            }
        )
    )

@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
    form = MyModelForm

或者:

class MyModelForm(forms.ModelForm):
    class Meta:
        widgets = {
            'state': forms.CheckboxInput(attrs={'checked':True}),
        }

@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
    form = MyModelForm

0

如果你的情况是initialdefault属性都无法正常工作,那么请尝试以下方法:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接