2009-06-23 2 views
11

Dies ist, wie ich ging über ein Boolesche Modellfeld in Form anzuzeigen, wie Radio-Buttons Ja und NeinZeigen Sie ein Feld boolean Modell in einer django Form als Optionsfeld anstatt die Checkbox Standard

choices = ((1,'Yes'), 
      (0,'No'), 
     ) 

class EmailEditForm(forms.ModelForm): 

    #Display radio buttons instead of checkboxes 
    to_send_form = forms.ChoiceField(choices=choices,widget=forms.RadioSelect) 

    class Meta: 
    model = EmailParticipant 
    fields = ('to_send_email','to_send_form') 

    def clean(self): 
    """ 
    A workaround as the cleaned_data seems to contain u'1' and u'0'. There may be a better way. 
    """ 

    self.cleaned_data['to_send_form'] = int(self.cleaned_data['to_send_form']) 
    return self.cleaned_data 

Wie Sie im obigen Code sehen können, brauche ich eine clean-Methode, die die Eingabezeichenfolge in eine Ganzzahl konvertiert, die möglicherweise unnötig ist.

Gibt es einen besseren und/oder djangoic Weg, dies zu tun. Wenn das so ist, wie?

Und nein, mit BooleanField scheint viel mehr Probleme zu verursachen. Das zu benutzen erschien mir offensichtlich; aber es ist nicht. Wieso ist es so.

Antwort

15

Verwendung TypedChoiceField.

class EmailEditForm(forms.ModelForm): 
    to_send_form = forms.TypedChoiceField(
         choices=choices, widget=forms.RadioSelect, coerce=int 
        ) 
+0

Note, die Auswahl ist eine Folge von Paaren (siehe http://docs.djangoproject.com/en/dev/ref/forms/fields/#django.forms.ChoiceField). Nicht ganz sicher, was in den Paaren ist, tho. – dfrankow

+1

Ich schaute in widgets.py, Auswahlen ist eine Liste von Tupeln des Formulars (choice_value, choice_label). – dfrankow

6
field = BooleanField(widget=RadioSelect(choices=YES_OR_NO), required=False) 


YES_OR_NO = (
    (True, 'Yes'), 
    (False, 'No') 
) 
+2

Ich denke, dass Daniels Lösung besser ist .... Ich denke nicht, dass dieser den eingereichten Wert zurück zu einem Bool zwingen wird. – mpen

+0

Diese Antwort gibt nicht an, ob es in dem Modell oder in dem Formular platziert werden soll. Ich bin etwas neu zu Django Formen und ich würde gerne sehen, ob das funktionieren würde und wo würde es funktionieren? –

+0

@StevenRogers dies ein Formularfeld kein Modellfeld; Es stellt also ein Feld innerhalb einer Django-Form dar, wobei mehrere Felder eine einzige Form bilden. Modellfelder repräsentieren dagegen die Spalten einer Datenbanktabelle. – jhrr

0

Wenn Sie mit booleans dieser statt Ints beschäftigen wollen, ist die Art und Weise, es zu tun.

forms.TypedChoiceField(
    choices=((True, 'Yes'), (False, 'No')), 
    widget=forms.RadioSelect, 
    coerce=lambda x: x == 'True' 
) 
Verwandte Themen