2009-03-23 26 views
15

簡単な質問に困っています: djangoフレームワークでmodelFormとchoiceFiedを使ってドロップダウンメニューの "disabled"フィールドを生成する方法はありますか?現時点でchoiceFieldの「無効」オプション - Django

、私はこのような出力を得るための方法を見つけ出すことはできませんが: - ルート1エントリ - (無効) - ELT 1 - (無効になっていない) - ルート2エントリ - (無効)

アドバイスをありますか?

ピエール

答えて

16

Djangoのフォームウィジェットが<option>タグにレンダリングされるべき属性のリスト渡す方法提供:残念ながら

my_choices = (('one', 'One'), ('two', 'Two')) 
class MyForm(forms.Form): 
    some_field = forms.ChoiceField(choices=my_choices, 
            widget=forms.Select(attrs={'disabled':'disabled'})) 

を属性が適用されますので、これはあなたのために動作しません。レンダリングされるすべてのオプションタグ。 Djangoは、どちらを有効にするべきか、無効にすべきかを自動的に知る方法はありません。

あなたのケースでは、私はカスタムウィジェットを書くことをお勧めします。それはかなり簡単ですし、それほどカスタムロジックを適用する必要はありません。これに関する文書はhereです。しかし要するに:あなたのサブクラスで、デフォルトの選択レンダラ

  • ある

    • サブクラスforms.Selectrender(self, name, value, attrs)メソッドを実装します。カスタムロジックを使用して、valueが無効にする必要があるかどうかを判断します。あなたが刺激を必要とする場合django/forms/widgets.pyrenderの非常に短い実装を見てください。

    その後、カスタムウィジェットを使用するようにフォームフィールドを定義します。

    class MyForm(forms.Form): 
        some_field = forms.ChoiceField(choices=my_choices, 
                widget=MyWidget) 
    
  • +1

    は、これは非常に素晴らしいソリューションですが、オプションの属性を変更するための適切な方法は、 'render_option()' 'レンダリングではありません() '(ウィジェット全体をレンダリングする) – jnns

    3

    あなたは、リスト項目をカテゴリに分類されているメニューを作成しようとしている、とあなたは、カテゴリ自身が選択できるようにしたくないですか?

    もしそうなら、あなたのテンプレートにタグを使用してフィールドを描画させることで、これを実現できます。

    <select name="my_field" id="id_my_field"> 
    <optgroup label="-- Root 1 entry --"> 
        <option value="1">Elt 1</option> 
        <option value="2">Elt 2</option> 
        <option value="3">Elt 3</option> 
    </optgroup> 
    <optgroup label="--- Root 2 entry ---"> 
        <option value="4">Elt 4</option> 
        <option value="5">Elt 5</option> 
    </optgroup> 
    </select> 
    
    4

    ジャンゴ1.1 "はOPTGROUP" できるようになりますようだ:Django documentation

    class MyForm(forms.Form): 
        some_field = forms.ChoiceField(choices=[ 
         ('Audio', (
           ('vinyl', 'Vinyl'), 
           ('cd', 'CD'), 
          ) 
         ), 
         ('Video', (
           ('vhs', 'VHS Tape'), 
           ('dvd', 'DVD'), 
          ) 
         ), 
         ('unknown', 'Unknown'), 
        ]) 
    

    この私見を持っている必要があります。

    4

    このようにBryanの説明に従って選択肢を作成することができます。以下のオプションルート1では、ルート2は自動的に無効になっていると、彼らはグループオプション

    CHOICES = (
        ('-- Root 1--', 
         (
         ('ELT1', 'ELT1'), 
         ('ELT2', 'ELT2'), 
         ('ELT3', 'ELT3'), 
        ) 
        ), 
        ('-- Root 2--', 
         (
         ('ELT3', 'ELT3'), 
         ('ELT4', 'ELT4'), 
        ) 
    ), 
    ) 
    

    上記のオプションは次のように表示されますようになります。下の画像では、ルート1とルート2は選択できません。

    enter image description here

    ・ホープこれはあなたの問題をクリアされます

    -Vikram

    関連する問題