Django内联表单集在用户同时编辑时抛出索引器
更新:我现在认为这是Django中存在的一个bug,报告如下 这让我抓狂,我以为这是因为我的表单代码,但我现在意识到我可以用我的模型和管理员重新创建它。我想知道这里的预期行为是什么: models.py:Django内联表单集在用户同时编辑时抛出索引器,django,django-forms,inline-formset,Django,Django Forms,Inline Formset,更新:我现在认为这是Django中存在的一个bug,报告如下 这让我抓狂,我以为这是因为我的表单代码,但我现在意识到我可以用我的模型和管理员重新创建它。我想知道这里的预期行为是什么: models.py: class Thingy(models.Model): description = models.CharField(max_length=256) class ThingyItem(models.Model): thingy = models.ForeignKey(Thin
class Thingy(models.Model):
description = models.CharField(max_length=256)
class ThingyItem(models.Model):
thingy = models.ForeignKey(Thingy)
description = models.CharField(max_length=256)
admin.py:
class ThingyItemInline(admin.TabularInline):
model = ThingyItem
extra = 0
class ThingyAdmin(admin.ModelAdmin):
inlines = [ThingyItemInline,]
admin.site.register(Thingy, ThingyAdmin)
admin.site.register(ThingyItem)
现在请执行以下操作:
- 在管理中创建一个包含多个ThingyItems的新Thingy并保存它
- 打开编辑页面
- 在第二个浏览器窗口中打开相同内容的编辑页面
- 选中最后一个项目上的“删除”按钮,并将其保存在第二个窗口中
- 现在返回到第一个表单并保存它
Traceback:
File "/Users/poswald/.virtualenvs/hats/lib/python2.6/site-packages/django/core/handlers/base.py" in get_response
100. response = callback(request, *callback_args, **callback_kwargs)
File "/Users/poswald/.virtualenvs/hats/lib/python2.6/site-packages/django/contrib/admin/options.py" in wrapper
265. return self.admin_site.admin_view(view)(*args, **kwargs)
File "/Users/poswald/.virtualenvs/hats/lib/python2.6/site-packages/django/utils/decorators.py" in _wrapped_view
76. response = view_func(request, *args, **kwargs)
File "/Users/poswald/.virtualenvs/hats/lib/python2.6/site-packages/django/views/decorators/cache.py" in _wrapped_view_func
78. response = view_func(request, *args, **kwargs)
File "/Users/poswald/.virtualenvs/hats/lib/python2.6/site-packages/django/contrib/admin/sites.py" in inner
190. return view(request, *args, **kwargs)
File "/Users/poswald/.virtualenvs/hats/lib/python2.6/site-packages/django/utils/decorators.py" in _wrapper
21. return decorator(bound_func)(*args, **kwargs)
File "/Users/poswald/.virtualenvs/hats/lib/python2.6/site-packages/django/utils/decorators.py" in _wrapped_view
76. response = view_func(request, *args, **kwargs)
File "/Users/poswald/.virtualenvs/hats/lib/python2.6/site-packages/django/utils/decorators.py" in bound_func
17. return func(self, *args2, **kwargs2)
File "/Users/poswald/.virtualenvs/hats/lib/python2.6/site-packages/django/db/transaction.py" in _commit_on_success
299. res = func(*args, **kw)
File "/Users/poswald/.virtualenvs/hats/lib/python2.6/site-packages/django/contrib/admin/options.py" in change_view
916. queryset=inline.queryset(request))
File "/Users/poswald/.virtualenvs/hats/lib/python2.6/site-packages/django/forms/models.py" in __init__
701. queryset=qs)
File "/Users/poswald/.virtualenvs/hats/lib/python2.6/site-packages/django/forms/models.py" in __init__
427. super(BaseModelFormSet, self).__init__(**defaults)
File "/Users/poswald/.virtualenvs/hats/lib/python2.6/site-packages/django/forms/formsets.py" in __init__
47. self._construct_forms()
File "/Users/poswald/.virtualenvs/hats/lib/python2.6/site-packages/django/forms/formsets.py" in _construct_forms
98. self.forms.append(self._construct_form(i))
File "/Users/poswald/.virtualenvs/hats/lib/python2.6/site-packages/django/forms/models.py" in _construct_form
714. form = super(BaseInlineFormSet, self)._construct_form(i, **kwargs)
File "/Users/poswald/.virtualenvs/hats/lib/python2.6/site-packages/django/forms/models.py" in _construct_form
451. kwargs['instance'] = self.get_queryset()[i]
File "/Users/poswald/.virtualenvs/hats/lib/python2.6/site-packages/django/db/models/query.py" in __getitem__
171. return self._result_cache[k]
Exception Type: IndexError at /admin/exampletest/thingy/1/
Exception Value: list index out of range
我不会在管理员中真正关心这个问题,除非它发生在我们的生产服务器上,代码中使用了我自己的表单。似乎内联表单集代码非常脆弱。当它确实应该检查这些假设是否仍然有效时,它信任与管理表单一起发送的数据
现在,我认为这是值得在Django Trac上报道的——我计划现在就这样做——但是我想知道这里是否有人发生过这种情况,如果有,你是如何解决的?是否有一种简单的方法来测试表单假设的这些前提条件是否仍然有效?我应该在我的视图或表单代码中这样做吗?对于任何其他遇到这种情况的人来说,这似乎是Django中的一个bug。我在这里提出了一个问题: