2012-11-15 86 views
0

這裏是我的模型是如何設置的:如何使用動態數量的相關對象創建ModelForm?

class ModelA(models.Model): 
    user = models.ForeignKey(User) 
    modelB = models.ForeignKey('ModelB', related_name='modelB') 
    # more fields here 

class ModelB(models.Model): 
    user = models.ForeignKey(User) 
    # more fields here 

用戶領域在這兩個類只是使這兩個可以由同一用戶以後進行查詢。

我有ModelB的ModelForm,我希望用戶能夠用動態數量的ModelA實例填充ModelB ModelForm。我希望ModelB的表單從ModelA的1個實例開始填寫,然後用戶應該能夠將更多的ModelA添加到ModelB的表單中。

我被困在這個作爲個人項目,真的很想前進。謝謝你的幫助!

編輯1:我知道我很可能需要通過重載ModelForms 來完成一些工作,但是就我所得到的那樣。此外,我正在使用ClassBasedGeneric Views(CreateView以獲得添加工作和稍後的EditView),但我願意離開,如果需要的話。

回答

1

您需要django inline formset

鑑於:

f_set = inlineformset_factory(ModelB, ModelA, extra=1) 

在模板,可以假設你是在一個div id爲one_to_many渲染form_set:

<form> 
    <div id="one_to_many"> 
     {{f_set.as_table}} 
    </div> 
</form> 

#This will render some thing like this 
<form> 
    <div id="one_to_many"> 
     <table> 
      <tr> 
       <th> 
        <label for="id_form-0-field_name">Field Name:</label> 
       </th> 
       <td> 
        <input id="id_form-0-field_name" type="text" name="form-0-field_name" value="" maxlength="100" /> 
        <input type="hidden" name="form-0-id" value="1" id="id_form-0-id" /> 
       </td> 
      </tr> 
     </table> 
     <input type="button" value="Add More Field" id="add_more"> 
    </div> 
</form> 

現在jquery部分添加動態場:

$(document).ready(function(){ 
     $('#add_more').click(function(){ 
      var tbl = $('#one_to_many').children('table'); 
      var last_id = parseInt(tbl.find('input[type=hidden]').last().val()); 
      var next_id = last_id + 1; 
      htm = '<tr><th><label for="id_form-'+last_id+'-field_name">Field Name:</label></th><td><input id="id_form-'+last_id+'-field_name" type="text" name="form-'+last_id+'-field_name" value="" maxlength="100" /><input type="hidden" name="form-'+last_id+'-id" value="'+next_id+'" id="id_form-'+last_id+'-id" /></td></tr>' 
      tbl.find('tr').last().after(htm); 

     });  
    }); 

您可以在jsfiddle上測試此項。請注意,這隻適用於您渲染表格as_table

+0

這是否允許我在飛行中添加更多的modelA? – edhedges

+0

不,你必須手動使用jQuery來做到這一點。我正在更新我的答案,添加一個片段,你可以做到這一點。 –

+0

我想我大概可以找出jQuery部分,但如果您添加其他代碼段,我不會抱怨。我很擔心在運行中添加這些字段的服務器端驗證。 – edhedges