Как визуализировать форму Django с RadioSelect, не получая проверенную радиокнопку по умолчанию? - PullRequest
16 голосов
/ 14 июля 2010

В Django 1.2.1 я использую ModelForm и создаю форму с помощью радиокнопок:

class myModelForm(ModelForm):    
    class Meta:
        model = myModel
        widgets = {
            'choose': RadioSelect(),
        } 


Это создает дополнительный ввод с поддельным значением:

<li><input type="radio" id="id_choose_0" value="" name="choose1" /> ---------</li>
<li><input type="radio" id="id_choose_1" value="1" name="choose1" /> First choice</li>


Я понимаю, что могу избавиться от автоматически сгенерированного пустого поля ввода, установив значение по умолчанию:

myChoices = (
    ("1", "First choice"),("2", "Second choice"),("3", "Third choice"),
)    

class myModel(models.Model):
    choose = models.CharField(max_length=1, choices=myChoices, default=1...


Так что в этом случае выбирается первый выбор:

<li><input checked="checked" type="radio" id="id_choose_1" value="1" name="choose1" /> First choice</li>
<li><input type="radio" id="id_choose_2" value="2" name="choose2" /> Second choice</li>

Но как отобразить форму без проверенного входного атрибута?

(и без автоматически сгенерированного)

Ответы [ 3 ]

15 голосов
/ 17 июля 2010

Это своего рода хакерское решение, но я протестировал его на работоспособность: просто установите для поля по умолчанию значение, которое не является одним из вариантов (я рекомендую установить его на None). При рендеринге формы Django не будет знать, какой вход помечать как отмеченный, поэтому он не будет проверять все они (без сообщения об ошибке). А тот факт, что есть значение по умолчанию, означает, что не будет автоматически сгенерированного поля ввода.

11 голосов
/ 31 января 2014

В Django 1.6 (не тестировал его в других версиях) все, что вам нужно, это default=None:

class myModel(models.Model):
    choose = models.CharField(..., default=None)

class myModelForm(ModelForm):
    class Meta:
        model = myModel
        widgets = {
            'choose': RadioSelect(),
        }
4 голосов
/ 28 июня 2012

Предыдущее решение не сработало бы для меня.

Поэтому я просто выбрал первый виджет.

class myModelForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(ContactForm, self).__init__(*args, **kwargs)
        self.fields['choose'].choices = self.fields['choose'].choices[1:]

    class Meta:
        model = myModel
        widgets = {
            'choose': RadioSelect(),
        } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...