2016-03-28 209 views
0

我發現了一些類似的問題,但並不完全。我對Django是'新'的,並且嘗試創建一個動態表單,也沒有Models。我想要讀取一個目錄,找到某個類型的文件,然後將這些文件顯示在清單中,供選擇和稍後處理。我仍然需要制定選擇和處理方法,但對於初學者,我只想讓清單工作。我在這裏找到了清單表格:Django form multiple choice,這就是我的表格。將對象傳遞給Django表單

這是我到目前爲止。打印聲明僅用於我自己的疑難解答,並且我始終得到'什麼參數?'我的猜測是我沒有正確傳遞參數,但它看起來像我讀過的其他示例的數量。

在此先感謝您的支持。

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時不斷收到'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) 
    ... 

您可能還會考慮將txt_list的計算移動到__init__的形式;這樣你根本不需要通過它。

+0

非常感謝,謝謝你的解釋。下一步,收集起來並處理。再次感謝! – LOlliffe