我的模型:
我的“事件”通过以下声明引用了多个“项目”:
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中?
答案 0 :(得分:1)
在方法中,保存对象,然后在items
字段中获取相关实例并添加其依赖项。但是,当您调用super方法时,Django会再次保存该表单-包括许多相关的对象,但是它不知道您添加的对象,因此只会用选定的对象覆盖它们。
通常,您想要的行为似乎有些奇怪,但是您可以通过根本不调用super方法来保留它。除了保存之外,默认实现的主要作用是重定向到成功URL。因此,您应该用明确执行此操作的行替换该超级调用:
return HttpResponseRedirect(self.get_success_url())