Модель Python / Django BooleanField с формой RadioSelect по умолчанию пуста - PullRequest
2 голосов
/ 12 августа 2010

Я использую 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 ]

6 голосов
/ 12 августа 2010

Ваш код на самом деле делает то, что вам нужно. Он отображает переключатели без выбранных параметров и генерирует сообщение об ошибке, если ничего не выбрано.

Небольшая заметка о вашем коде формы. Я бы сделал это так:

class myModelForm(forms.ModelForm):

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

    class Meta:
        model = MyModel
2 голосов
/ 12 августа 2010

К сожалению, это не проблема Django, а вопрос HTML.Спецификация HTML (RFC1866) гласит:

Всегда проверяется только одна из переключателей в наборе.Если ни один из элементов набора переключателей не указывает `CHECKED ', то пользовательский агент должен сначала проверить первую переключатель набора.

Однако браузеры исторически игнорировали этои реализовал переключатели по-разному.

HTML также усложняет эту задачу, поскольку атрибут «checked» тега не принимает параметр, поэтому вы не можете использовать настраиваемый виджет Django, который устанавливает для этого атрибута значение False или No.1011 *

Возможный обходной путь - добавить небольшой Javascript, который запускается как часть события onLoad документа, который находит все переключатели на странице и устанавливает для атрибута «checked» значение false (например, с использованием JQuery).

1 голос
/ 13 августа 2010
0 голосов
/ 19 марта 2014

Я создаю настраиваемое поле с виджетом по умолчанию.

Отрезок моих 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...