django - 内联表单集在保存时返回空列表?

标签 django django-forms formset inline-formset

当我尝试保存内联表单集时,它只返回一个空列表,并且数据库中没有反射(reflect)任何更改。我尝试过在没有选项和 commit=False 的情况下执行此操作,但它们都有相同的结果。我知道有数据,因为我将表单集打印为表格,并且我知道它是有效的,因为属性 is_valid() 方法返回 true。这是代码:

def edit(request):
    if request.method == 'POST':
        print(request.POST)
        form = TombstoneForm(request.POST)
        print(form.is_valid())
        t = form.save(commit=False)
        t.edit_date = datetime.now()
        t.user_editor = request.user
        t.save()
        print(t)
        formset_construct = inlineformset_factory(Tombstone, Tank, form=TombstoneForm)
        formset = formset_construct(request.POST)
        print("Passed the inline formset")
        print(formset.as_table())
        print(formset.is_valid())
        l = formset.save()
        print(l)
    return render(request, 'main.html')

最佳答案

所以我相信我已经找到了问题的根源和解决方法。问题发生在 BaseModelFormSet 类的此方法中:

    def save_existing_objects(self, commit=True):
        self.changed_objects = []
        self.deleted_objects = []
        if not self.initial_forms:
            return []

        saved_instances = []
        forms_to_delete = self.deleted_forms
        for form in self.initial_forms:
            obj = form.instance
            # If the pk is None, it means either:
            # 1. The object is an unexpected empty model, created by invalid
            #    POST data such as an object outside the formset's queryset.
            # 2. The object was already deleted from the database.
            if obj.pk is None:
                continue
            if form in forms_to_delete:
                self.deleted_objects.append(obj)
                self.delete_existing(obj, commit=commit)
            elif form.has_changed():
                self.changed_objects.append((obj, form.changed_data))
                saved_instances.append(self.save_existing(form, obj, commit=commit))
                if not commit:
                    self.saved_forms.append(form)
        return saved_instances

问题发生在:

if obj.pk is None:
    continue

总是点击继续,所以我的解决方案就是保存单个表单数据而不是表单集数据:

        for form in formset:
            val = form.save(commit=False)
            val.Vessel = t
            val.save()

关于django - 内联表单集在保存时返回空列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50910152/

相关文章:

python - 如何将默认值数组添加到 ArrayField?

python - Django __unicode__ :\n and manytomany?

django - 如何使 RadioSelect 将图像作为单选值?

Django 如何保存自定义表单集

django - 如何通过 docker-compose 给 Postgres 用户 super 用户权限?

html - 为什么我的 CSS 文件在 Django 中不起作用?

python - Django 1.8 管理表单 : AttributeError XForm object has no attribute 'save_m2m'

python - Django FormWizard 如何动态更改 form_list

python - 从 Django 中的几种形式收集信息

Django:使用实例初始化自定义表单的 FormSet