Django视图撤销了我的代码已实现的目标

时间:2018-09-26 14:20:20

标签: django django-views

我的模型:

我的“事件”通过以下声明引用了多个“项目”:

items = models.ManyToManyField('Item')

我的表单:

我在引导式多选小部件中列出了很多项目。为了节省时间,我在表单中添加了一个复选框,该复选框还将选择的“项目”的后代也添加到“事件”中。

addToChildren = forms.BooleanField(required=False, label="Add event to descendants of selected item")

我的视图:

提交表单后,我将使用以下代码添加后代:

class EventUpdate(UpdateView):
    #declared model, formclass and success url, but left it off for the question

    def form_valid(self, form):
        event = form.save()
        if form.cleaned_data['addToChildren'] == True:  #add to children if told to do so.
            print("items before save")
            print(self.object.items.all())
            for x in range(0,form.cleaned_data['items'].count()):
                itm = form.cleaned_data['items'][x]
                for descendant in itm.get_descendants():
                    self.object.items.add(descendant)#deletes when updated
            print("items after save")
            print(self.object.items.all())
        return super(EventUpdate, self).form_valid(form)

我的问题:

打印语句清楚地表明所选项目的后代已添加到self.object(我的事件对象)中。

问题在于return语句无视我的更改,将所选项目添加到事件中,并从事件中删除所有未选择的项目。我想停止。

是否有一种方法可以从Django视图中将信息附加到form.cleaned_data中?

1 个答案:

答案 0 :(得分:1)

在方法中,保存对象,然后在items字段中获取相关实例并添加其依赖项。但是,当您调用super方法时,Django会再次保存该表单-包括许多相关的对象,但是它不知道您添加的对象,因此只会用选定的对象覆盖它们。

通常,您想要的行为似乎有些奇怪,但是您可以通过根本不调用super方法来保留它。除了保存之外,默认实现的主要作用是重定向到成功URL。因此,您应该用明确执行此操作的行替换该超级调用:

return HttpResponseRedirect(self.get_success_url())