Pytanie Jak renderować formularz Django za pomocą RadioSelect, nie otrzymując domyślnie sprawdzonego sygnału radiowego?


W Django 1.2.1 używam ModelForm i generuję formularz z radiobuttons:

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


Generuje to dodatkowe wejście z fałszywą wartością:

<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>


Rozumiem, że mogę pozbyć się automatycznie wygenerowanego pustego pola wejściowego, ustawiając wartość domyślną:

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

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


W tym przypadku wybiera się pierwszy wybór:

<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>

Ale jak wyrenderować mój formularz bez sprawdzanego atrybutu wejściowego?

(i bez automatycznego generowania)


15
2017-07-14 17:41


pochodzenie




Odpowiedzi:


Jest to dość hackowate rozwiązanie, ale przetestowałem je pod kątem działania: wystarczy ustawić wartość domyślną dla pola na wartość, która nie jest jedną z opcji (zalecam ustawienie tej wartości na None). Podczas renderowania formularza Django nie będzie wiedział, które dane wejściowe zaznaczyć jako zaznaczone, więc pozostawi je niezaznaczone (bez rzucania błędu). A fakt, że istnieje wartość domyślna oznacza, że ​​nie będzie generowanego automatycznie pola wejściowego.


14
2017-07-17 14:50



To działa i nie sądzę, że jest to szczególnie odrażające, chyba że ktoś inny ma więcej rozwiązań wglądu (ponieważ brakuje dokumentacji w tym obszarze), oznaczy to jako poprawną odpowiedź. Dzięki - amoeba


W Django 1.6 (nie przetestowałem go w innych wersjach) wszystko, czego potrzebujesz, to default=None:

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

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

11
2018-01-31 08:55



Działa w wersji 1.4.10 - Vlad T.
Działa to w wersji 1.6.2, ale jeśli również przekazujesz blank=True jako argument na forms.RadioSelect pozostawi domyślną opcję "-------", nawet jeśli jej używasz default=None. Musisz usunąć blank=True - Deepend
@Poruszająca końcówka blank=True jest rdzeniem Model argument pola. Odpowiednikiem formularzy jest required=False. Ale to jest dziwne w przypadku RadioSelect, ponieważ użytkownik nie może odznaczyć radiobutonów. W każdym razie, puste nie jest rzeczą formy. Jeśli utworzysz modelformę niż puste = True w modelu staje się wymagane = Fałsz w formularzu. Możesz ustawić required = True w polu modelu bez dotykania pustego = True w modelu poprzez ponowne zdefiniowanie pola w modelu. docs.djangoproject.com/en/1.8/topics/forms/modelforms - allcaps
Działa to również dla mnie w Django 1.10. - Wim Feijen


Poprzednie rozwiązanie nie byłoby dla mnie skuteczne.

Dlatego właśnie wycinam pierwszy wybór widżetu.

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(),
        } 

4
2018-06-28 09:16



Dla ModelChoiceField możesz tego użyć self.fields['choose'].choices = [(c.id, c.field_name_to_display) for c in self.fields['choose'].queryset] - Mark Mishyn