Python 如何使ModelForm具有动态数量的相关对象?

Python 如何使ModelForm具有动态数量的相关对象?,python,django,django-models,django-forms,Python,Django,Django Models,Django Forms,以下是如何设置我的模型: 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

以下是如何设置我的模型:

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实例开始,然后用户应该能够向ModelB的表单中添加更多ModelA

我把这当作一个个人项目,我真的很想继续前进。谢谢你的帮助

编辑1:我知道我很可能需要通过重载ModelForms
def\uuuu init\uuu
来做一些工作,但这是我所能做的。此外,我还使用ClassBasedGeneric视图(CreateView以使add工作,并在以后使用EditView),但如果需要,我愿意放弃它。

您需要

鉴于:

f_set = inlineformset_factory(ModelB, ModelA, extra=1)
在模板中,假设您正在呈现id为一对多的
div
中的表单集:

<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>

你可以在电脑上测试。注意:只有将表单
呈现为_table

时,此操作才有效。这是否允许我动态添加更多modelA?不,您必须使用jquery手动执行此操作。我正在更新我的答案,以便添加一个代码片段,我想我可能能够理解jQuery部分,但如果您添加另一个代码片段,我不会抱怨。我担心动态添加这些字段的服务器端验证。另一种方法是将
相关字段
显示为文本字段。并要求用户输入逗号分隔的值。在后端,用逗号分割字符串,然后逐个保存(或批量创建)到相关模型。我更喜欢这个实现,而不是csv值。我本来打算这么做的,但我宁愿让django做比我更多的工作:)
$(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);

        });    
    });