带有RadioSelect形式的Python / Django BooleanField模型默认为空

时间:2010-08-12 14:35:21

标签: django widget modelform radio-button

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

4 个答案:

答案 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)