我正在使用Django ModelForm,其中我的模型包含BooleanField,与该BooleanField关联的表单窗口小部件是RadioSelect窗口小部件。我希望RadioSelect小部件呈现没有选择任何选项,因此用户必须明确做出选择,但如果表单验证没有选择则表单验证失败。有没有办法做到这一点?
models.py
myboolean = models.BooleanField(choices=YES_NO)
forms.py
class myModelForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(myModelForm, self).__init__(*args, **kwargs)
self.fields['myboolean'].widget = forms.RadioSelect(choices=YES_NO)
答案 0 :(得分:6)
您的代码实际上可以满足您的需求。它会在没有选择选项的情况下呈现单选按钮,并在未选择任何内容时生成错误消息。
关于您的表单代码的小注释。我会这样做:
class myModelForm(forms.ModelForm):
myboolean = forms.BooleanField(widget=forms.RadioSelect(choices=YES_NO))
class Meta:
model = MyModel
答案 1 :(得分:2)
不幸的是,这不是一个Django问题,而是一个HTML问题。 HTML规范(RFC1866)说:
在任何时候,都会检查一组中的一个单选按钮。如果没有< INPUT>一组单选按钮的元素指定“CHECKED”,然后用户代理必须首先检查该组的第一个单选按钮。
然而,浏览器历来忽略了这一点,并以不同的方式实现了单选按钮。
HTML也使这很困难,因为< INPUT>的“checked”属性。 tag不带参数,因此您不能使用将此属性设置为False或No的自定义Django小部件。
一种可能的解决方法是添加一个小的Javascript,它作为文档的onLoad事件的一部分运行,该事件查找页面上的所有单选按钮,并将'checked'属性设置为false(例如,使用JQuery)。
答案 2 :(得分:1)
答案 3 :(得分:0)
我使用默认小部件创建自定义字段。
剪切我的models.py:
class Order(models.Model):
...
# transport = models.CharField(choices=transport.choices,max_length=25,null=True)
transport = SelectField(choices=transport.choices,max_length=25,null=True)
...
字段定义:
from django.db import models
from django.forms import widgets
class SelectField(models.CharField):
def formfield(self, **kwargs):
if self._choices:
defaults = {'widget': widgets.RadioSelect}
defaults.update(kwargs)
return super(SelectField, self).formfield(**defaults)