删除另一个标签中的相关内联记录时发生MultiValueDictKeyError

时间:2019-01-29 15:23:43

标签: django django-models django-forms django-views

我会尽量简洁。

背景

我有一个模型Person,其中有一个ForeignKey可以建模Document。每个Person只能有一个Document,但是,您可能已经知道,每个Document可以链接到许多Person

Document的管理表单中,与Person关联的Document s内联显示。我可以在那里编辑,添加或删除Person

问题

按照以下步骤操作,我会收到错误消息:

  1. 我打开Document的管理员编辑表单。我们称之为 Document 一个。这个Document有两个关联的Person,我们称它们为 John Doe Jane Doe 。您可以在表格中(在线)看到它们,并且 这些字段是可编辑的,但我不会碰它们。
  2. 我打开另一个标签,直接转到Person列表并删除 简·道(Jane Doe)
  3. 我回到第一个标签(Document的编辑表单),然后单击 “ 保存并继续编辑”。
  4. 表格已发送,顶部出现一般错误( 像)“ 请修复以下错误”。但是表格没有显示 错误(在字段旁边)以更正,并且显然是记录 不会显示 Jane Doe
  5. 我再次单击“ 保存并继续编辑”,当表单为 发送我得到错误“ MultiValueDictKeyError: "u'person_set-1-id'"”。

理想的解决方案

我希望能够在中间阶段显示自定义错误(在第一次保存后出现第一个错误时),并说“ 与此文档关联的人在您编辑”。另外,非常希望防止最终错误。

错误转储

MultiValueDictKeyError at /admin/persons/document/1145/

"u'person_set-1-id'"

Request Method:     POST
Request URL:    http://localhost:8000/admin/persons/document/1145/
Django Version:     1.7.7
Exception Type:     MultiValueDictKeyError
Exception Value:    

"u'person_set-1-id'"

Exception Location:     /__PATH__/local/lib/python2.7/site-packages/django/utils/datastructures.py in __getitem__, line 319
Python Executable:  /__PATH__/bin/python
Python Version:     2.7.15
Python Path:    

['/__PATH__/test/test/apps',
 '/__PATH__/test',
 '/__PATH__/lib/python2.7',
 '/__PATH__/lib/python2.7/plat-x86_64-linux-gnu',
 '/__PATH__/lib/python2.7/lib-tk',
 '/__PATH__/lib/python2.7/lib-old',
 '/__PATH__/lib/python2.7/lib-dynload',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-x86_64-linux-gnu',
 '/usr/lib/python2.7/lib-tk',
 '/__PATH__/local/lib/python2.7/site-packages',
 '/__PATH__/src/django-smart-selects',
 '/__PATH__/lib/python2.7/site-packages',
 '/__PATH__/local/lib/python2.7/site-packages/odf',
 '/__PATH__/local/lib/python2.7/site-packages/odf',
 '/__PATH__/local/lib/python2.7/site-packages/odf',
 '/__PATH__/local/lib/python2.7/site-packages/odf',
 '/__PATH__/local/lib/python2.7/site-packages/odf',
 '/__PATH__/local/lib/python2.7/site-packages/odf',
 '/__PATH__/local/lib/python2.7/site-packages/odf',
 '/__PATH__/test']

Server time:    Mar, 29 Ene 2019 11:52:18 -0300

Environment:


Request Method: POST
Request URL: http://localhost:8000/admin/persons/document/1145/

Django Version: 1.7.7
Python Version: 2.7.15
Installed Applications:
('salmonella',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.admin',
 'crispy_forms',
 'test.apps.persons',
 'captcha',
 'django_countries',
 'django_extensions',
 'import_export',
 'django_object_actions',
 'widget_tweaks',
 'smart_selects',
 'daterange_filter',
 'compressor',
 'auditlog')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.locale.LocaleMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'auditlog.middleware.AuditlogMiddleware')


Traceback:
File "/__PATH__/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  111.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/__PATH__/local/lib/python2.7/site-packages/django/contrib/admin/options.py" in wrapper
  583.                 return self.admin_site.admin_view(view)(*args, **kwargs)
File "/__PATH__/local/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapped_view
  105.                     response = view_func(request, *args, **kwargs)
File "/__PATH__/local/lib/python2.7/site-packages/django/views/decorators/cache.py" in _wrapped_view_func
  52.         response = view_func(request, *args, **kwargs)
File "/__PATH__/local/lib/python2.7/site-packages/django/contrib/admin/sites.py" in inner
  206.             return view(request, *args, **kwargs)
File "/__PATH__/local/lib/python2.7/site-packages/django/contrib/admin/options.py" in change_view
  1456.         return self.changeform_view(request, object_id, form_url, extra_context)
File "/__PATH__/local/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapper
  29.             return bound_func(*args, **kwargs)
File "/__PATH__/local/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapped_view
  105.                     response = view_func(request, *args, **kwargs)
File "/__PATH__/local/lib/python2.7/site-packages/django/utils/decorators.py" in bound_func
  25.                 return func.__get__(self, type(self))(*args2, **kwargs2)
File "/__PATH__/local/lib/python2.7/site-packages/django/db/transaction.py" in inner
  394.                 return func(*args, **kwargs)
File "/__PATH__/local/lib/python2.7/site-packages/django/contrib/admin/options.py" in changeform_view
  1403.             if all_valid(formsets) and form_validated:
File "/__PATH__/local/lib/python2.7/site-packages/django/forms/formsets.py" in all_valid
  438.         if not formset.is_valid():
File "/__PATH__/local/lib/python2.7/site-packages/django/forms/formsets.py" in is_valid
  303.         self.errors
File "/__PATH__/local/lib/python2.7/site-packages/django/forms/formsets.py" in errors
  277.             self.full_clean()
File "/__PATH__/local/lib/python2.7/site-packages/django/forms/formsets.py" in full_clean
  325.             form = self.forms[i]
File "/__PATH__/local/lib/python2.7/site-packages/django/utils/functional.py" in __get__
  55.         res = instance.__dict__[self.func.__name__] = self.func(instance)
File "/__PATH__/local/lib/python2.7/site-packages/django/forms/formsets.py" in forms
  141.         forms = [self._construct_form(i) for i in xrange(self.total_form_count())]
File "/__PATH__/local/lib/python2.7/site-packages/django/forms/models.py" in _construct_form
  868.         form = super(BaseInlineFormSet, self)._construct_form(i, **kwargs)
File "/__PATH__/local/lib/python2.7/site-packages/django/forms/models.py" in _construct_form
  581.             pk = self.data[pk_key]
File "/__PATH__/local/lib/python2.7/site-packages/django/utils/datastructures.py" in __getitem__
  319.             raise MultiValueDictKeyError(repr(key))

Exception Type: MultiValueDictKeyError at /admin/persons/document/1145/
Exception Value: "u'person_set-1-id'"

更新

我正在添加模型Person和Document的定义。

class Document(models.Model):
    creation_date = models.DateTimeField(auto_now_add=True)
    title = models.CharField(max_length=300, null=True, blank=True)

class Person(models.Model):
    first_name = models.CharField(max_length=300)
    last_name = models.CharField(max_length=300)
    email = models.EmailField(max_length=300)
    document = models.ForeignKey(Document)

更新2

我注意到的一件重要的事情是,在第一个错误页面中(在第一次提交 Document A 表单之后)设置了诸如person_set-TOTAL_FORMSperson_set-INITIAL_FORMS之类的隐藏输入到2,而应将其设置为1(实际人数)。显然发生这种情况是因为提交的数据未反映实际的数据库状态。

0 个答案:

没有答案