2009-07-15 18 views
0

私は現在のユーザが属するチームに限定されるフィールド "チーム"を持つフォームセットを持っています。Djangoフォームセットで利用可能な選択肢を制限する

def edit_scrapbook(request): 
    u=request.user 
    ScrapbookAjaxForm = modelformset_factory(Scrapbook, fields= 
      ('description','status','team')) 
    choices=False 
    for t in u.team_set.all(): 
     if choices: 
      choices=choices,(t.id,t.name) 
     else: 
      choices=choices,(t.id,t.name) 
    if request.method == 'POST': 
     formset = ScrapbookAjaxForm(request.POST, 
      queryset=Scrapbook.objects.filter(owner=u)) 
     if formset.is_valid(): 
      instances=formset.save(commit=False) 
      for i in instances: 
       i.owner=request.user 
       i.save() 
      formset.save_m2m()  
      return HttpResponseRedirect(reverse('scrapbooks.views.index')) 
    else: 
     formset = ScrapbookAjaxForm(queryset=Scrapbook.objects.filter(owner=u)) 
     for form in forms: 
      for field in form: 
       if field.label == 'Team': 
        field.choices=choices 
    c=RequestContext(request) 
    return render_to_response('scrapbooks/ajax_edit.html', 
      {'fs':formset},context_instance=c) 

これは、すべてのフォームでの選択に影響を与えていないようです。これはかなり醜いです。おそらくこの問題をあまりにも長く見ている結果です。私もカスタムフォームセットを使用しようとしましたが、私はパラメータを受け入れるカスタムフォームセットを取得するように見えることはできません。

サブセレクトの[チーム]フィールドの選択肢を、フォームセット内のユーザーのチームに基づいて制限する方法を教えてください。 django model documentationから

答えて

1

最後に、選択肢がどの 反復可能なオブジェクトであることに注意してください - 必ずしも リストやタプル。これにより、 の選択肢を動的に構築することができます。しかし 自分自身をハッキングする選択肢が の場合、 ForeignKeyを持つ適切なデータベーステーブルを使用する方がよいでしょう。選択肢は、 静的なデータがあまり変更されない場合は の場合に意味します。

私は同じ考え方を使用します:フォームでは、チームのためにForeignKeyを使用して、いくつかのクエリでそのリストを制限することができます。

さらにいくつかの提案:

  • は、その初期に与えられたパラメータに基づか、その内容を制限するクエリを使用して、チーム
  • Define your own ModelChoiceFieldのためのForeignKeyを使用してください。
  • Override the default field type、独自のModelChoiceFieldを使用する。 ModelChoiceFieldの初期化でチームのフィルタを渡す必要があることに注意してください。
+0

どのようにしてオブジェクトのリストをformsetに送信できますか?これは私が問題を抱えているところで、私はformsetに固執するビューで私が行う設定を取得するように見えることはできません。 –

+0

これで、イテラブルのリストを設定する方法を追加しました。 –

0

これが問題の原因であるかどうかはわかりませんが、選択タプルを構築する方法に大きな問題があります。

4つのチームの後、選択肢は次のようになります。明らかに選択フィールドを設定するための、有効ではありません

((((False, (1, u'Team 1')), (2L, u'Team 2')), (3, u'Team 3')), (4, u'Team 4')) 

を。ループ全体の代わりにリストの理解度を使用する方がはるかに良い方法です:

choices = [(t.id,t.name) for t in u.team_set.all()] 
+0

ありがとう!私はまだPythonでリストを扱うことに慣れていません。それははるかにクリーンな方法であり、正しい結果を生成すると言います。残念ながら私の問題は解決しません。 –

関連する問題