Встроенный набор форм Django генерирует IndexError, когда пользователи одновременно редактируют - PullRequest
3 голосов
/ 07 марта 2011

Обновлено: теперь я думаю, что это существующая ошибка в Django, о которой сообщается как Ticket 14642

Это сводит меня с ума, и я думал, что это из-замой код формы, но теперь я понимаю, что могу воссоздать его, используя мои модели и администратора.Я хотел бы знать, каково ожидаемое поведение здесь:

models.py:

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)

Теперь сделайте следующее:

  • Создайте новый Thingy с несколькими ThingyItems в админке и сохраните его.
  • Откройте страницу редактирования.
  • Откройте страницу редактирования для той же вещи в секундуокно браузера.
  • Проверьте кнопку «Удалить» на последнем ThingyItem и сохраните его во втором окне.
  • Теперь вернитесь к первой форме и сохраните ее

Когда я это делаю, я получаю:

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

Меня это не особо волнует, за исключением того, что это происходит на нашем производственном сервере в коде с использованием моих собственных форм.Кажется, что встроенный код formset довольно хрупок.Он доверяет данным, отправленным с формой управления, когда действительно должен проверить, что эти предположения все еще действительны.

Теперь, я думаю, что это стоит сообщить в Django Trac - и я планирую сделать это прямо сейчас -однако мне было интересно, если кто-нибудь здесь когда-либо имел это случиться, и если так, как вы обошли это?Есть ли простой способ проверить, действительны ли эти предварительные условия, принятые в форме?Должен ли я сделать это в моем представлении или коде формы?

1 Ответ

3 голосов
/ 11 марта 2011

Для всех остальных, кто столкнулся с этим, похоже, это ошибка в Django.Я открыл вопрос, чтобы решить его здесь: http://code.djangoproject.com/ticket/15574

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...