首页 > 解决方案 > Django UpdateWithInlinesView 不保存已删除的内联

问题描述

我正在使用 jQuery 插件(由 elo80ka 提供)从模板中添加和删除内联。我遇到的问题是当我添加新数据时一切顺利并且数据被保存。但是,一旦我尝试删除现有的,我就会得到一个没有删除对象的重定向。(一旦我点击删除,内联就会被删除,我已经通过 Inspector 进行了检查)

class PlaceUpdateInline(InlineFormSetFactory):
    model = AdditionalLoadingPlace
    form_class = AdditionalLoadingPlaceInlineFormSet
    factory_kwargs = {'extra': 0, 'max_num': 5,
                    'can_order': False, 'can_delete': True}

class PlaceUpdateView(LoginRequiredMixin, UpdateWithInlinesView):
    model = Place
    form_class = PlaceCreateForm
    inlines = [PlaceUpdateInline]

    def forms_valid(self, form, inlines):
        form.instance.author = self.request.user
        self.object = form.save(commit=False)
        self.object.author = self.request.user
        form.save(commit=True)

        for inline in inlines:
            objects = inline.save(commit=False)
            for obj in inline.deleted_objects:
                # never called
                obj.delete()
            for object in objects:
                if object.place:
                    object.save()
        return HttpResponseRedirect(self.get_success_url())

编辑:

所以,我的模板对每个字段都有这个自定义呈现:

{{ inlines.0.management_form }}
{{ inlines.0.non_form_errors }}
{% for form in inlines.0 %}
    <div class="inline {{ inlines.0.prefix }}">
        {{ form.hidden_field.as_hidden }} 
        {{ form.place.errors }}
        {{ form.place }}
        {{ form.id }}
    </div>
{% endfor %}

但是如果我这样做,删除就可以了:

{{ inlines.0.management_form }}
{{ inlines.0.non_form_errors }}
{% for form in inlines.0 %}
    <div class="inline {{ inlines.0.prefix }}">
        {{ form.as_p }}
    </div>
{% endfor %}

我的隐藏字段似乎有问题(我稍后用 jQuery 更新,我不想向用户展示)

标签: djangodjango-forms

解决方案


无论如何,我的模板中似乎遗漏了一些东西并且它没有正确渲染(我猜)。所以我最终这样做了:

{% for field in form.hidden_fields %}
    {{ field }}
{% endfor %}

{% for field in form.visible_fields %}
    {{ field }}
{% endfor %}

并且还让我的字段从表单中隐藏:

class PlaceInlineFormSet(ModelForm):

    class Meta:
        model = AdditionalLoadingPlace
        fields = ('hidden_field', 'place')

        widgets = {
            'place' : forms.TextInput(),
            'hidden_field': forms.HiddenInput(),
        }

推荐阅读