我在Django中使用BooleanField
。
默认情况下,它生成的复选框处于未选中状态。我想要默认情况下处于选中状态。我怎么做?
我在Django中使用BooleanField
。
默认情况下,它生成的复选框处于未选中状态。我想要默认情况下处于选中状态。我怎么做?
如果您只是使用普通表单(而不是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})
from django.db import models
class Foo(models.Model):
any_field = models.BooleanField(default=True)
initial
(对于未绑定表单),但没有提到 default
。 - user我正在使用django==1.11。获得最多赞的答案实际上是错误的。从django的文档中可以看到:
initial -- 用于此字段初始显示的值。如果未提供数据,则不会使用此值作为回退。
如果您深入了解表单验证过程的代码,您将发现对于每个字段,表单会调用其小部件(widget)的value_from_datadict
来获取实际值,因此这是我们可以注入默认值的地方。
要为BooleanField
执行此操作,我们可以继承自CheckboxInput
,重写默认的value_from_datadict
和init
函数。
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
。谢谢。 - freezedclass MyForm(forms.Form):
my_boolean = forms.BooleanField(required=False, initial=True)
class model_name(models.Model):
example_name = models.BooleanField(default=False)
active = forms.BooleanField(
widget=forms.CheckboxInput(
attrs={
'checked': True
}
)
)
我尝试更改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})
但我们无法在通用编辑视图中调用表单。 我认为这是常规调用表单对象的一个很好的替代方案。
如果下面 models.BooleanField() 中的 default=True
在 models.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
如果你的情况是initial
和default
属性都无法正常工作,那么请尝试以下方法:
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
form = MyForm(initial={'my_field':True})
,我在文档中没有立刻找到它。 - Paco