ChatGPT解决这个技术问题 Extra ChatGPT

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

我在 Django 中使用 BooleanField

默认情况下,它生成的复选框是未选中状态。我希望默认检查状态。我怎么做?


u
user8193706

如果您只是使用普通表单(不是 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)

最后,如果您想在运行时动态选择是否默认选择您的字段,您可以在 initialize it 时使用表单的初始参数:

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

感谢 form = MyForm(initial={'my_field':True}),我没有立即在文档中找到它。
这个答案实际上是 wronginitial value is not default value as described in @DW answer
G
Gabi Purcaru
from django.db import models

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

这是在哪里记录的?文档中提到了 initial(对于未绑定的形式),但没有提到 default
在这个答案中,回答者使用的是模型字段,而不是表单字段。这就是区别所在。这让我大吃一惊,因为我跳过它只是为了查看默认的 kwarg。默认值不是有效的 forms.Form kwarg。只是想发布一下以澄清这个答案,因为它有 0 条评论。
这仅适用于表单模型字段。此外,更改模型默认值只是为了不同地显示初始值有点多,特别是在设置初始值如此简单的情况下。
D
D.W

我正在使用 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)

Django 3.0 也有效。谢谢。
A
Aurélien

在 Django 3.0 中,model.py 中 BooleanField 的默认值设置如下:

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

S
Sajad Jalilian

我发现最干净的方法是这样。

在 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

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

L
Leotrim Lota

检查 BooleanField 中默认状态的另一种方法是:

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