2009-06-23 11 views
11

これは私がはいラジオボタンなどの形でブーリアンモデルフィールドを表示するには、歩き回った方法で、第ラジオボタンとしてDjangoのフォームで表示ブールモデルフィールドではなく、デフォルトのチェックボックス

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 

上記のコードでわかるように、入力文字列を整数に変換するクリーンなメソッドが必要です。これは不要かもしれません。

これを行うには、より良い方法やジャンゴーイックな方法がありますか?もしそうなら、どうですか?

いいえ、BooleanFieldを使用すると、さらに多くの問題が発生するようです。それを使って私には明らかでした。しかし、そうではありません。なぜそうですか?

答えて

15

TypedChoiceFieldを使用してください。

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

選択肢がペアのシーケンスであることに注意してください(http://docs.djangoproject.com/en/dev/ref/forms/fields/#django.forms.ChoiceFieldを参照してください)。ペアに何が入っているのか分かりません。 – dfrankow

+1

widgets.pyを見ると、choicesはフォームのタプルのリスト(choice_value、choice_label)です。 – dfrankow

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


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

私はダニエルの解決策が良いと思っています....私はこれが提出された価値をブールに強制するとは思わない。 – mpen

+0

この回答は、モデルまたはフォームに配置する必要がある場合は記載されていません。 私はDjangoフォームに若干新しくなっています。これがうまくいくかどうか、どこで動作するか確認したいと思います。 –

+0

@StevenRogersこれはフォームフィールドではなく、モデルフィールドです。これは、複数のフィールドが単一のフォームを構成するジャンゴフォーム内の1つのフィールドを表します。一方、モデルフィールドは、データベーステーブルの列を表します。 – jhrr

0

あなたはブール値の代わりに、int型に対処したい場合、これはそれを行う方法です。

forms.TypedChoiceField(
    choices=((True, 'Yes'), (False, 'No')), 
    widget=forms.RadioSelect, 
    coerce=lambda x: x == 'True' 
) 
関連する問題