Django视图撤消我的代码所实现的功能

Django视图撤消我的代码所实现的功能,django,django-views,Django,Django Views,我的型号: 我的“事件”通过以下声明引用了几个“项目”: items = models.ManyToManyField('Item') 我的表格: 我在引导多选择小部件中列出了很多项。为了节省时间,我在表单中添加了一个复选框,该复选框也会将所选“项”的后代添加到我的“事件”中 addToChildren = forms.BooleanField(required=False, label="Add event to descendants of selected item") 我的观点: 提

我的型号:

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

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)
我的问题:

print语句清楚地显示,中所选项目的后代正在添加到self.object(我的事件对象)

问题是return语句忽略我的更改,将选定项添加到我的事件中,并从我的事件中删除所有未选定项。我希望这一切停止


是否有方法从django视图将信息附加到form.cleaned_数据中?

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

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

return HttpResponseRedirect(self.get_success_url())

这是什么样的观点?是创建新实例还是更新现有实例?(为什么您要遍历
范围(0,form.cleaned_data['items'].count())
而不是直接遍历
form.cleaned_data['items']
?)@DanielRoseman这是一个要更新的视图。我在该范围内进行迭代是因为我试图直接添加到
表单。在我的代码的前几次迭代中清理了数据['items']
,并且我不想经历比需要更多的for循环迭代。这是有道理的,但此解决方案的一个问题是该表单的其他部分也需要保存(日期、事件详细信息等)如果不在视图中手工编码,是否有办法保存该信息而不进行覆盖?但所有这些都在哪里完成?通常,该逻辑应该在表单中,因此
form.save()
应该涵盖所有内容。我明白了。这解决了问题。谢谢你的回答!做得很好。