dar*_*dar 56 django django-models django-forms
Django 1.0.2中是否有一个小部件呈现models.BooleanField为两个单选按钮而不是复选框?
ete*_*ode 86
Django 1.2为模型添加了"小部件"Meta选项:
在models.py中,为布尔字段指定"choices":
BOOL_CHOICES = ((True, 'Yes'), (False, 'No'))
class MyModel(models.Model):
yes_or_no = models.BooleanField(choices=BOOL_CHOICES)
Run Code Online (Sandbox Code Playgroud)
然后,在forms.py中,为该字段指定RadioSelect小部件:
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
widgets = {
'yes_or_no': forms.RadioSelect
}
Run Code Online (Sandbox Code Playgroud)
我用SQLite数据库测试了它,它也将布尔值存储为1/0值,并且它似乎在没有自定义强制函数的情况下工作正常.
Dan*_*man 62
您可以通过覆盖ModelForm中的字段定义来完成此操作:
class MyModelForm(forms.ModelForm):
boolfield = forms.TypedChoiceField(
coerce=lambda x: x == 'True',
choices=((False, 'False'), (True, 'True')),
widget=forms.RadioSelect
)
class Meta:
model = MyModel
Run Code Online (Sandbox Code Playgroud)
小智 30
修改丹尼尔罗斯曼的答案,你可以通过使用整数来简单地修复bool("False")=真正的问题:
class MyModelForm(forms.ModelForm):
boolfield = forms.TypedChoiceField(coerce=lambda x: bool(int(x)),
choices=((0, 'False'), (1, 'True')),
widget=forms.RadioSelect
)
class Meta:
model = MyModel
Run Code Online (Sandbox Code Playgroud)
Rac*_*ole 10
这是我能找到的最简单的方法(我正在使用Django 1.5):
class MyModelForm(forms.ModelForm):
yes_no = forms.BooleanField(widget=RadioSelect(choices=[(True, 'Yes'),
(False, 'No')]))
Run Code Online (Sandbox Code Playgroud)
小智 10
在Django 1.6中,以下内容对我有用:
class EmailSettingsForm(ModelForm):
class Meta:
model = EmailSetting
fields = ['setting']
widgets = {'setting': RadioSelect(choices=[
(True, 'Keep updated with emails.'),
(False, 'No, don\'t email me.')
])}
Run Code Online (Sandbox Code Playgroud)
这是一个使用lambda的快速和肮脏的强制函数,它绕过了"False" - > True问题:
...
boolfield = forms.TypedChoiceField(coerce=lambda x: x and (x.lower() != 'false'),
...
Run Code Online (Sandbox Code Playgroud)
由于 @Daniel Roseman 的答案存在问题, bool('False') --> True,所以现在我在这里合并了两个答案来制定一个解决方案。
def boolean_coerce(value):
# value is received as a unicode string
if str(value).lower() in ("1", "true"):
return True
elif str(value).lower() in ("0", "false"):
return False
return None
class MyModelForm(forms.ModelForm):
boolfield = forms.TypedChoiceField(
coerce=boolean_coerce,
choices=((False, "False"), (True, "True")),
widget=forms.RadioSelect,
)
class Meta:
model = MyModel
Run Code Online (Sandbox Code Playgroud)
现在这可以工作了:)
与@ eternicode的答案相同,但不修改模型:
class MyModelForm(forms.ModelForm):
yes_no = forms.RadioSelect(choices=[(True, 'Yes'), (False, 'No')])
class Meta:
model = MyModel
widgets = {'boolfield': yes_no}
Run Code Online (Sandbox Code Playgroud)
我认为这只适用于Django 1.2+
| 归档时间: |
|
| 查看次数: |
38034 次 |
| 最近记录: |