3

モデルのデータに基づいてChoiceFieldを定義しています。

field = forms.ChoiceField(choices=[[r.id, r.name] for r in Model.objects.all()])

ただし、「no」オブジェクトを選択するには、オプションの前に空のオプションを追加したいと思います。しかし、私はそれを前に付ける良い方法を見つけることができません。

私のすべてのテストは次のようになります:

field = forms.ChoiceField(choices=[[0, '----------']].extend([[r.id, r.name] for r in Model.objects.all()]))

「NoneTypeオブジェクトは反復できません」というエラーを返します。私が今まで見つけた唯一の方法は次のとおりです:

def append_empty(choices):
    ret = [[0, '----------']]
    for c in choices:
        ret.append(c)
   return ret

そして、私が自分のフィールドを定義するとき:

forms.ChoiceField(choices=append_empty([[r.id, r.name] for r in
    Restaurant.objects.all()]), required=False)

ただし、コードをクリーンに保ち、そのような恐怖を持たないようにしたいと思います。アイデアはありますか?:pよろしくお願いします。

4

2 に答える 2

10

簡単な答えは次のとおりです。

field = forms.ChoiceField(choices=[[0, '----------']] + [[r.id, r.name] for r in Model.objects.all()])

残念ながら、あなたのアプローチには欠陥があります。「作業中」のアプローチでも、フィールドの選択肢は、フォームがインスタンス化されるときではなく、フォームが定義されるときに定義されます。したがって、モデルテーブルに要素を追加すると、それらは選択肢リストに表示されません。

__init__フォームのメソッドで割り当てを行うことにより、これを回避できます。

ただし、はるかに簡単なアプローチがあります。フィールドの選択を動的にいじるのではなく、モデルからの選択を提供するように特別に設計されたフィールドを使用する必要があります- ModelChoiceField。これにより、インスタンス化時にモデル要素のリストが動的に取得されるだけでなく、デフォルトで空白の選択肢がすでに含まれています。ドキュメントを参照してください。

于 2009-09-16T10:08:23.990 に答える
1

この質問とその答えが問題をほぼ解決したので、私はちょうど何かを追加したいと思いました。私の場合、モデルが「0」を有効なオプションとして認識しなかったため、IDは空である必要がありましたが、空(null = True、blank = True)を受け入れました。イニシャライザで:

self.fields['option_field'].choices = [
    ('', '------')] + [[r.id, r.name] for r in Model.objects.all()] 
于 2017-06-12T21:53:59.570 に答える