2016-03-28 34 views
0

私はいくつかの同様の質問を見つけましたが、それほどのものはありません。私はDjangoにとっては新しい、新しいモデルで、モデルもなく動的なフォームを作成しようとしています。私は、ディレクトリを読んで、タイプのファイルを見つけて、そのファイルをチェックリストに表示して、選択と後の処理をしたいと思っています。選択と処理はまだ解決する必要がありますが、まずはチェックリストを作成したいと思います。私はチェックリストのフォームをここに見つけました:Django form multiple choiceこれは私のフォームに基づいています。オブジェクトをDjangoフォームに渡す

これまで私がこれまで持っていたことは次のとおりです。 printステートメントは私のトラブルシューティングのためのものです。私の推測では、私は引数を正しく渡していないが、私が読んだ他の例の数のように見える。

事前に感謝の意を表します。

views.py

def select(request): 
    if request.method == 'POST': 
     txt_list = [fn for fn in os.listdir('/static/data/') if re.search(r'\.txt$', fn, re.IGNORECASE)] 
     txt_zip = zip(txt_list, txt_list) 

     form = SelectForm(request.POST, txt_zip=txt_zip) 
     if form.is_valid(): 
      choices = form.cleaned_data.get('choices') 
      # do something with your results 
    else: 
     form = SelectForm 

    return render_to_response('select.html', {'form': form}, 
           context_instance=RequestContext(request)) 

forms.py

class SelectForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     self.txt = kwargs.pop('txt_zip', None) 
     super(SelectForm, self).__init__(*args, **kwargs) 
     if self.txt is not None: 
      print("Got args") 
     else: 
      print("What args?") 

    CHOICES = (list(self.txt),) 
    # tuple contents (<value>, <label>) 

    choices = forms.MultipleChoiceField(choices=CHOICES, widget=forms.CheckboxSelectMultiple()) 

(完全を期すために)テンプレート

<div class="container"> 
    <h2>Select files for reports</h2> 
    <br/> 
    <form method='post'>{% csrf_token %} 
     {{ form.as_p }} 
     <br/> 
     <input type='submit' value='Select files' class="btn btn-primary"> 
    </form> 
</div> 
+0

POSTのときに 'what args 'を取得してもよろしいですか? 'else'ブランチで' form = SelectForm() 'を実行する必要があり、' txt_zip'パラメータを与えないように思えます。 –

答えて

1

あなたはかなりのエラーがあります。self.txtはCHOICESで参照するクラスレベルで定義されていないので、これはまったく実行されています。

なぜargsエラーが発生するのかは、POSTではないときにフォームに何も渡していないことです。つまり、最初にページを開いて空のフォームを表示するときです。実際には、インスタンス化していないので、それよりも悪いです。 elseブロック内の呼び出し括弧を使用する必要があります。

これを修正したら、上記のエラーが発生します。 __init__の方法でも選択肢を設定する必要があります。フィールドに空のデフォルトを定義して上書きすることができます。だから、:

class SelectForm(forms.Form): 
    choices = forms.MultipleChoiceField(choices=(), widget=forms.CheckboxSelectMultiple()) 
    def __init__(self, *args, **kwargs): 
     txt = kwargs.pop('txt_zip', None) 
     super(SelectForm, self).__init__(*args, **kwargs) 
     self.fields['choices'].choices = txt 

def select(request): 
    txt_list = [fn for fn in os.listdir('/static/data/') if re.search(r'\.txt$', fn, re.IGNORECASE)] 
    txt_zip = zip(txt_list, txt_list) 

    if request.method == 'POST': 

     form = SelectForm(request.POST, txt_zip=txt_zip) 
     if form.is_valid(): 
      choices = form.cleaned_data.get('choices') 
      # do something with your results 
    else: 
     form = SelectForm(txt_zip=txt_zip) 
    ... 

また、フォーム__init__にtxt_listの計算を移動することを検討かもしれません。あなたはまったくそれを渡す必要はありません。

+0

おかげさまで、説明に感謝します。次のステップは、それらを集めて処理することです。再度、感謝します! – LOlliffe

関連する問題