我正在使用Django 1.11作为我的第一个Django / Python项目,并且为了创建一个允许通过一个表单创建多个模型实例的表单,我们已经停留了几天试图理解Formsets . 我们将非常感谢您提供的帮助我理解并解决此问题的任何帮助!

我接近它的方式如下:

我有以下型号:

class Task(models.Model):
    client_name = models.ForeignKey(Client,null=True,blank=True,on_delete=models.DO_NOTHING)
    description = models.CharField(max_length=255)
    due_date = models.DateField(null=True,blank=True,default=datetime.now)
    assigned = models.ForeignKey(User,on_delete=models.DO_NOTHING)

我有以下基于该模型的表格:

class FNTaskForm(ModelForm):
    class Meta:
        model = Task
        exclude = ()

我已经基于上面的模型和形式创建了以下FormSet:

TaskFormSet = modelformset_factory(Task, form = FNTaskForm, exclude=(),extra=2)

在views.py我有:

class FNTaskCreate(CreateView):
    model = Task
    form_class = FNTaskForm
    template_name = 'fntasks.html'

    def get_context_data(self, **kwargs):
            context = super(FNTaskCreate, self).get_context_data(**kwargs)
            context['formset'] = TaskFormSet(queryset=Task.objects.none()) # providing none
            return context

最后我在我的html模板中渲染它:

<form method="post">
{% csrf_token %}
<table class="table link-formset">
{% for form in formset %}
{% if forloop.first %}
<thead>
  <tr>
    {% for field in form.visible_fields %}
    <th>{{ field.label }}</th>
    {% endfor %}
  </tr>
</thead>
{% endif %}
<tr class="{% cycle row1 row2 %} formset_row">
  {% for field in form.visible_fields %}
  <td>
    {# Include the hidden fields in the form #}
    {% if forloop.first %}
    {% for hidden in form.hidden_fields %}
    {{ hidden }}
    {% endfor %}
    {% endif %}
    {{ field.errors.as_ul }}
    {{ field }}
  </td>
{% endfor %}
</tr>
{% endfor %}
<a class="btn btn-default" href="{% url 'clients' %}">Cancel</a>
<input type="submit" value="Next" class="btn btn-primary" />
</form>

该表单在页面上显示如下:
enter image description here

我所拥有的问题以及我在解决问题上感谢的问题包括两部分:

第1部分 . 我无法使用此表单将数据成功保存到模型中 . 我没有得到任何错误,但我相信表单有3个实例,而不仅仅是显示的2个实例,它是第三个(不可见的实例)是空白的,因此不允许表单有效 . 我认为这与第2期(下文)有关 . 当我插入print我的kwargs.pop变量来测试它时,我得到3个输出'None' . 所以我认为,由于我对Django的无知和缺乏经验,我没有正确使用模型formset工厂 .

第2部分 . 我还想使用kwargs使用URL中传递的kwarg'clientlist'来设置'Client Name'字段的初始值 . 我使用以下内容来确认kwarg,但结果是(None None None):

def __init__(self, *args, **kwargs):
    clientlist = kwargs.pop('clientlist', None)
    super().__init__(*args, **kwargs)
    print(clientlist)

传递kwarg的URL如下:

url(r'^tasks/create/(?P<clientlist>\d+)/$',views.FNTaskCreate.as_view(),name='fntask_create'),

是否有人能够帮助我传递这些问题以使用modelformset_factory(或任何其他更好的推荐方法)来成功保存多个模型实例,其中一个表单将kwargs传递到表单的初始字段中?感谢你的时间!