Python Django:删除的对象导致索引器错误

Python Django:删除的对象导致索引器错误,python,ajax,django,Python,Ajax,Django,我有点困惑,我需要一些帮助 我使用ModelFormset显示我的对象,然后使用Ajax动态删除它们,然后再次使用Ajax调用保存所有对象。一切都是动态的,页面在任何时候都不会重新加载 问题是,当Django尝试在删除一两个对象后使用Ajax保存整个表单集时,它会查找已删除的对象,并引发索引器:列表索引超出范围,因为对象不再位于查询集中 这就是我显示和保存表单集的方式(简化版-我认为这就是错误的来源): 这就是我删除对象的方式(这是一个不同的视图): 在实例化t\u formset和s\u fo

我有点困惑,我需要一些帮助

我使用ModelFormset显示我的对象,然后使用Ajax动态删除它们,然后再次使用Ajax调用保存所有对象。一切都是动态的,页面在任何时候都不会重新加载

问题是,当Django尝试在删除一两个对象后使用Ajax保存整个表单集时,它会查找已删除的对象,并引发
索引器:列表索引超出范围
,因为对象不再位于查询集中

这就是我显示和保存表单集的方式(简化版-我认为这就是错误的来源):

这就是我删除对象的方式(这是一个不同的视图):

在实例化
t\u formset
s\u formset
时,我尝试放置
queryset=tquery
queryset=squery
,但没有帮助。我该怎么办?如果有用的话,我正在使用Postgres db

错误:

> File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 115, in get_response
    response = callback(request, *callback_args, **callback_kwargs)
  File "/usr/local/lib/python2.7/dist-packages/django/contrib/auth/decorators.py", line 25, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "/home/eimantas/Desktop/Projects/Lynx/lynx/views.py", line 122, in App
    t_formset = TopicFormSet(request.POST, queryset = tquery)
  File "/usr/local/lib/python2.7/dist-packages/django/forms/models.py", line 441, in __init__
    super(BaseModelFormSet, self).__init__(**defaults)
  File "/usr/local/lib/python2.7/dist-packages/django/forms/formsets.py", line 56, in __init__
    self._construct_forms()
  File "/usr/local/lib/python2.7/dist-packages/django/forms/formsets.py", line 124, in _construct_forms
    self.forms.append(self._construct_form(i))
  File "/usr/local/lib/python2.7/dist-packages/django/forms/models.py", line 468, in _construct_form
    kwargs['instance'] = self.get_queryset()[i]
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 198, in __getitem__
    return self._result_cache[k]
IndexError: list index out of range

这可能是已在删除摘要对象的级联删除的情况:

删除ForeignKey引用的对象时,Django 默认值模拟删除级联上SQL约束的行为 并删除包含ForeignKey的对象


它与第二视图和Ajax调用无关。我认为你把事情搞砸了。比如
初始形式计数
总形式计数
或类似的东西

另一个要点。在检查表单集是否有效之前,不要保存表单集:

t_formset = TopicFormSet(request.POST)
if t_formset.is_valid():
    t_formset.save()

在G+组中,我被告知,技术上可以重置或“重新加载”Queryset,但很难维持“所有级别”,可能不会带来任何好处。我被建议在保存表单集表单时使用迭代并检查每个对象是否已成功保存(我必须覆盖
form=TopicForm
form=SummaryForm
save()
方法)


我决定根本不使用表单集,而是单独列出并保存每个对象,这对我和我的应用程序的业务逻辑都会更好。

只是一个猜测:你能像建议的那样将
删除
过程包含到事务中吗?我不确定这是否是你的意思,但是我添加了两行
transaction.enter\u transaction\u management(),但不幸的是,我得到了相同的错误。我在启动表单集之前也做了相同的事情,但错误是相同的。您可能还需要更改删除顺序-在摘要之后删除主题。不幸的是,这也没有帮助。我试图只留下
summary.delete()
,但是查询集无法像我所想的那样找到已删除的
summary
。如果可能的话,我需要从queryset中删除删除的对象。我发现事实并非如此——我忘了提到我正在使用Postgres。问题仍然存在。嘿,谢谢你的回答。错误回溯将我精确地指向主题表单集的实例化行:
t\u formset=TopicFormSet(request.POST,queryset=tquery)
Summary
对象具有主题的外键),因此我认为这不是问题。我还试图删除
summary.delete()
行,但不幸的是,它也不起作用。感谢您指出这一点。不过,我已经回答了自己的问题。
> File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 115, in get_response
    response = callback(request, *callback_args, **callback_kwargs)
  File "/usr/local/lib/python2.7/dist-packages/django/contrib/auth/decorators.py", line 25, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "/home/eimantas/Desktop/Projects/Lynx/lynx/views.py", line 122, in App
    t_formset = TopicFormSet(request.POST, queryset = tquery)
  File "/usr/local/lib/python2.7/dist-packages/django/forms/models.py", line 441, in __init__
    super(BaseModelFormSet, self).__init__(**defaults)
  File "/usr/local/lib/python2.7/dist-packages/django/forms/formsets.py", line 56, in __init__
    self._construct_forms()
  File "/usr/local/lib/python2.7/dist-packages/django/forms/formsets.py", line 124, in _construct_forms
    self.forms.append(self._construct_form(i))
  File "/usr/local/lib/python2.7/dist-packages/django/forms/models.py", line 468, in _construct_form
    kwargs['instance'] = self.get_queryset()[i]
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 198, in __getitem__
    return self._result_cache[k]
IndexError: list index out of range
t_formset = TopicFormSet(request.POST)
if t_formset.is_valid():
    t_formset.save()