2011-09-02 6 views
14

文書では、が表示されますas a <select> box with "Unknown", "Yes" and "No" choices.selectの値を他の意味のあるテキストに変更して、modelformのyes、no、およびunknownの値に戻すにはどうすればよいですか?例えばdjango:modelformのnullbooleanfieldの値を変更する方法は?

私はyes_no_required = models.NullBooleanField()を持っていると私は、はい、いいえ、それに応じて必要に'yes I acknowledge this''no, I do not like this''I do not know now'マッピングを持っていると思います。

答えて

29

私はこの作品に自分自身を証明するために一緒にデモを入れて半分の時間を費やし:

CHOICES = (
    (None, "I do not know now"), 
    (True, "Yes I acknowledge this"), 
    (False, "No, I do not like this") 
) 

class Demo(models.Model): 
    yes_no_required = models.NullBooleanField(choices = CHOICES) 

class DemoForm(forms.ModelForm): 
    class Meta: 
     model = Demo 

私は、Djangoのソースコードに見えました。 すべては選択配列を受け入れることができます。明らかに、理にかなっていないものもありますが、可能です。

+3

Djangoのように、NullをFormFiに追加することができますnull-attrがtrueに設定されているため、選択肢はありません。これらの選択肢に実際に制限するためにFormFieldにも選択肢を渡す必要があります。 – codingjoe

+0

これはもう動作していません。 'TypeError:__init __()は予期せぬキーワード引数 'choices'を持っています –

3

あなたはこのように(モデルを修正するwithouth)の形でこれを扱うことができます:はい/いいえ:

forms.NullBooleanField(
    widget=forms.RadioSelect(renderer=HorizontalRadioRendererSpace, 
     choices=CHOICES), 
    label='...', 
    required=False) 

私はのような三つの状態にあることができるデータのNullBooleanFieldを使用することが悪い考えだと思います/ unset。

データの編集は機能します。しかし、このデータの検索フォームを作成する場合、大きな問題が発生します。

そして、「空」の値は、二つの意味を持つことができます。

  • は、この属性のために気にしないでください。すべての行を含める
  • 列がNULLのこれらの行のみを含めます。

解決方法は簡単です.ChoiceFieldを使用します。ここ

詳細:https://github.com/guettli/programming-guidelines/blob/master/README.rst

2

あなたのModelFormでのメタクラスをごフィールドのウィジェットを変更することができます。

CHOICES = (
      (None, "I do not know now"), 
      (True, "Yes I acknowledge this"), 
      (False, "No, I do not like this"), 
      ) 
class DemoForm(forms.ModelForm): 
    class Meta: 
     model = Demo 
     fields = ("demo_field",) 
     widgets = { 
       'demo_field': forms.RadioSelect(choices = CHOICES), 
        } 
1

シンプルなアプローチは、フォームでウィジェット選択を変更するには、次のようになります。

class YourForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     super(YourForm, self).__init__(*args, **kwargs) 
     new_choices = ((1, 'I do not know now'), 
         (2, 'Yes I acknowledge this'), 
         (3, 'No, I do not like this')) 
     self.fields['your_field'].widget.choices = new_choices 
関連する問題