2

我正在使用一个 Django ModelForm,其中我的模型包含一个 BooleanField,并且与该 BooleanField 关联的表单小部件是一个 RadioSelect 小部件。我希望 RadioSelect 小部件呈现为没有选择任何选项,因此用户必须明确做出选择,但如果他们没有选择,表单验证将失败。有没有办法做到这一点?

模型.py

myboolean = models.BooleanField(choices=YES_NO)

表格.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

4 回答 4

6

您的代码实际上可以满足您的需要。它呈现未选择任何选项的单选按钮,如果未选择任何选项,则生成错误消息。

关于表单代码的小注释。我会这样做:

class myModelForm(forms.ModelForm):

    myboolean = forms.BooleanField(widget=forms.RadioSelect(choices=YES_NO))

    class Meta:
        model = MyModel
于 2010-08-12T15:35:07.027 回答
2

不幸的是,这与其说是一个 Django 问题,不如说是一个 HTML 问题。HTML 规范 (RFC1866) 说:

在任何时候,都会检查一组中的一个单选按钮。如果一组单选按钮的 <INPUT> 元素都没有指定“已检查”,则用户代理必须首先检查该组的第一个单选按钮。

然而,浏览器历来忽略了这一点,并以不同的方式实现了单选按钮。

HTML 也使这变得困难,因为 <INPUT> 标记的“checked”属性不带参数,因此您不能使用自定义的 Django 小部件将此属性设置为 False 或 No。

一种可能的解决方法是放入一个作为文档的 onLoad 事件的一部分运行的小 Javascript,该事件会查找页面上的所有单选按钮并将“checked”属性设置为 false(例如,使用 JQuery)。

于 2010-08-12T16:25:40.470 回答
1

看到这个: http ://docs.djangoproject.com/en/dev/topics/forms/modelforms/#a-full-example

于 2010-08-12T20:51:26.367 回答
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)
于 2014-03-19T09:50:31.693 回答