基于Django类的UpdateView,带有内联formset

时间:2015-07-28 17:45:36

标签: django python-3.x django-class-based-views inline-formset

我有一个模型PSG,它与另一个模型SubPSG有关系。 PSGs可以有多个SubPSGs。我在创建SubPSGs时使用内联表单集创建PSGs。 CreateView工作正常,但UpdateView没有按预期工作。 UpdateView如下:

class PSGUpdate(GroupRequiredMixin, UpdateView):
    model = PSG
    form_class = PSGForm
    template_name = "management/psg_update_form.html"
    success_url = reverse_lazy('dashboard')
    group_required = [u"admin", "manager"]

    def get_context_data(self, **kwargs):
        context = super(PSGUpdate, self).get_context_data(**kwargs)
        subpsgs = SubPSG.objects.filter(psg=self.object).values()
        sub_formset = inlineformset_factory(PSG, SubPSG, fields=('name',), can_delete=True,
                                                extra=len(subpsgs), formset=BaseSubPSGFormset,)
        context['formset'] = sub_formset(instance=self.object, initial=subpsgs, prefix='psg')
        return context

    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        subpsgs = SubPSG.objects.filter(psg=self.object).values()
        psg_form = PSGForm(request.POST, instance=self.object)
        sub_formset = inlineformset_factory(PSG, SubPSG, fields=('name',), can_delete=True, extra=len(subpsgs), formset=BaseSubPSGFormset)
        formset = sub_formset(self.request.POST, instance=self.object,  prefix='psg')
        if all([psg_form.is_valid(), formset.is_valid()]):
            return self.form_valid(psg_form, formset)
        else:
            return self.form_invalid(psg_form, formset)

    def form_valid(self, form, formset):
        if all([formset.is_valid() and form.is_valid()]):
            self.object = form.save()
            instances = formset.save(commit=False)
            for form in instances:
                form.psg = self.object
                form.save()
            return HttpResponseRedirect(self.get_success_url())
        else:
            return super(PSGUpdate, self).form_valid(form)

当我尝试更新SubPSG表单集时,会创建一个新对象而不是编辑。此外,还创建了其他表单集的副本。

我做错了什么?

0 个答案:

没有答案