2017-05-26 135 views
0

我試圖製作一個表單,該表單有一次添加多個對象的選項。我希望它有一個「添加另一個」按鈕 - 單擊時會出現一個新的表單域用於添加其他對象。如果以前沒有提交過輸入,我希望表單保留它。是否有可能爲此使用模板標籤(即django模板標籤而不是javascript)?如果需要,將字段添加到表單中django

回答

1

您的表單必須基於從POST傳遞給它的一些變量(或者盲目檢查屬性)來構造。每次重新載入視圖時都會構造表單本身,因此HTML需要包含有關構建正確數量的字段以進行驗證的字段數的信息。

我會看看這個問題的方式FormSet的工作:有一個隱藏的字段,其中包含活動表格的數量,並且每個表格名稱都以表格索引作爲前綴。實際上,您可以創建一個字段FormSet

https://docs.djangoproject.com/en/dev/topics/forms/formsets/#formsets

這裏有一個從頭開始做 - 它應該給你一些想法。這也解答了您關於傳遞參數給__init__問題 - 你只是傳遞參數給對象的構造函數:MyForm('arg1', 'arg2', kwarg1='keyword arg')

###瀏覽

類MyForm的(forms.Form): original_field = forms.CharField( ) extra_field_count = forms.CharField(插件= forms.HiddenInput())

def __init__(self, *args, **kwargs): 
    extra_fields = kwargs.pop('extra', 0) 

    super(MyForm, self).__init__(*args, **kwargs) 
    self.fields['extra_field_count'].initial = extra_fields 

    for index in range(int(extra_fields)): 
     # generate extra fields in the number specified via extra_fields 
     self.fields['extra_field_{index}'.format(index=index)] = \ 
      forms.CharField() 

DEF MyView的(請求): 如果request.method == 'POST': 形式= MyForm的(request.POST,額外= request.POST.get( 'extra_field_count') 如果form.is_valid(): 「有效的」 打印 其他: 形式= MyForm的() 返回渲染(請求, 「模板」,{ '形式':形式})

### HTML

form_count = Number($("[name=extra_field_count]").val()); 
// get extra form count so we know what index to use for the next item. 
$("#add-another").click(function() { 
    form_count ++; 

    element = $('<input type="text"/>'); 
    element.attr('name', 'extra_field_' + form_count); 
    $("#forms").append(element); 
    // build element and append it to our forms container 

    $("[name=extra_field_count]").val(form_count); 
    // increment form count so our view knows to populate 
    // that many fields for validation 
}) 

<form> 
<div id="forms"> 
    {{ form.as_p }} 
</div> 
<button id="add-another">add another</button> 
<input type="submit" /> 
</form> 
+0

謝謝,它澄清了很多。 – McCzajnik

相關問題