Django:ModelFormSet 仅保存第一个条目

Django: ModelFormSet saving first entry only

更新:

问题似乎出在 Django-formset 的编码中。我将其作为内联表单集处理,而不是模型表单集。下面的答案也是正确的。谢谢!

我正在使用中间模型的模型表单集。我正在使用 django-formset js 在模板上添加额外的表单集字段。大多数一切正常,除了当我去保存表单集时,只有第一个条目被保存到数据库中。第一个条目被正确保存和分配,但之后的任何条目都消失了。它没有抛出任何错误,所以我不确定出了什么问题。谢谢!

模特

class StaffAssignment(models.Model):
    study = models.ForeignKey(Study, related_name='study_set', null=True, on_delete=models.CASCADE)
    staff = models.ForeignKey('account.UserProfile', related_name='assigned_to_set', null=True, on_delete=models.CASCADE)
    role = models.CharField(max_length=100, null=True)
    assigned_on = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ('-role',)

    def __str__(self):
        return '{} is assigned to {}'.format(self.staff, self.study)

表格:

class AddStaff(forms.ModelForm):
    model = StaffAssignment
    fields = ('staff',)

    def __init__(self, *args, **kwargs):
        super(AddStaff, self).__init__(*args, **kwargs)
        for field in self.fields:
            self.fields[field].widget.attrs.update({'class': 'form-control'})

观点:

def add_staff(request, study_slug):
    study = get_object_or_404(Study, slug=study_slug)
    staff_formset = modelformset_factory(StaffAssignment, form=AddStaff, fields=('staff',), can_delete=True)
    if request.method == 'POST':
        staffList = staff_formset(request.POST, request.FILES)
        if staffList.is_valid():
            for assignment in staffList:
                assigned = assignment.save(commit=False)
                assigned.study = study
                assigned.role = assigned.staff.job_title
                assigned.save()
            return HttpResponseRedirect(reverse('studies:studydashboard'))
        else:
            HttpResponse('Something is messed up')
    else:
        staffList = staff_formset(queryset=StaffAssignment.objects.none())
        return render(request, 'studies/addstaff.html', {'staffList': staffList, 'study': study})

模板:

    <form action="{% url 'studies:addstaff' study.slug %}" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <div class="box-body">
            {% for list in staffList %}
                <div class="form-group" id="formset">
                {% if list.instance.pk %}{{ list.DELETE }}{% endif %}
                    {{ list.staff }}
                    {% if list.staff.errors %}
                        {% for error in list.staff.errors %}
                            {{ error|escape }}
                        {% endfor %}
                    {% endif %}
                </div>
            {% endfor %}
            {{ staffList.management_form }}
    </div>
    <div class="box-footer">
        <button type="submit" class="btn btn-primary">Submit</button>
    </div>
    </form>

您没有在模板中包含主键字段,如 required by the docs。添加

{% for list in staffList %}
    {{ list.pk }}
    ...
{% endfor %}