【问题标题】:MultiValueDictKeyError when editing inline admin object编辑内联管理对象时出现 MultiValueDictKeyError
【发布时间】:2014-01-10 00:14:35
【问题描述】:

我正在使用来自 django 网站 django 版本 1.6.1 的 ManyToOne 关系设计一个简单的 MCQ 应用程序。我有一个内联管理表单,据说它允许我从同一个变更表单添加/编辑给定问题的答案。但是,如果在保存问题及其答案一次后,我无法从同一表单编辑/添加答案并获得 MultiValueDictKeyError。我的模型是:

class SBA (models.Model):
question = models.TextField(blank=False)
system = models.CharField(max_length=3, choices=pacscon.System.which_system)
case = models.ForeignKey('pacscon.Patient')
created = models.DateField(auto_now_add=True)
reference = models.TextField(blank=True)

def __unicode__(self):
    return self.question


class Answer(models.Model):
id = models.AutoField(primary_key=True)
body = models.TextField()
correct = models.BooleanField(default=False)
sba = models.ForeignKey(SBA, null=True)

def __unicode__(self):
    return self.body

admin.py 看起来像这样:

from models import Answer, SBA, Mnemonic
#from django import forms
from django.contrib import admin


class AnswerInline(admin.StackedInline):
    model = Answer
    extra = 2

class SBAAdmin(admin.ModelAdmin):
        fieldsets = (
            (None, {
                'fields': ('question', 'system', 'case', 'reference')
            }),
        )
        inlines = [
            AnswerInline,
        ]
        readonly_fields = ('created',)

admin.site.register(SBA, SBAAdmin)
admin.site.register(Answer)
admin.site.register(Mnemonic)

错误信息是:

MultiValueDictKeyError at /admin/knowledge/sba/1/


Traceback:
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
  114.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/contrib/admin/options.py" in wrapper
  432.                 return self.admin_site.admin_view(view)(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/utils/decorators.py" in _wrapped_view
  99.                     response = view_func(request, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/views/decorators/cache.py" in _wrapped_view_func
  52.         response = view_func(request, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/contrib/admin/sites.py" in inner
  198.             return view(request, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/utils/decorators.py" in _wrapper
  29.             return bound_func(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/utils/decorators.py" in _wrapped_view
  99.                     response = view_func(request, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/utils/decorators.py" in bound_func
  25.                 return func(self, *args2, **kwargs2)
File "/usr/local/lib/python2.7/dist-packages/django/db/transaction.py" in inner
  339.                 return func(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/contrib/admin/options.py" in change_view
  1229.             if all_valid(formsets) and form_validated:
File "/usr/local/lib/python2.7/dist-packages/django/forms/formsets.py" in all_valid
  415.         if not formset.is_valid():
File "/usr/local/lib/python2.7/dist-packages/django/forms/formsets.py" in is_valid
  292.         err = self.errors
File "/usr/local/lib/python2.7/dist-packages/django/forms/formsets.py" in errors
  267.             self.full_clean()
File "/usr/local/lib/python2.7/dist-packages/django/forms/formsets.py" in full_clean
  314.             form = self.forms[i]
File "/usr/local/lib/python2.7/dist-packages/django/utils/functional.py" in __get__
  49.         res = instance.__dict__[self.func.__name__] = self.func(instance)
File "/usr/local/lib/python2.7/dist-packages/django/forms/formsets.py" in forms
  133.         forms = [self._construct_form(i) for i in xrange(self.total_form_count())]
File "/usr/local/lib/python2.7/dist-packages/django/forms/models.py" in _construct_form
  848.         form = super(BaseInlineFormSet, self)._construct_form(i, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/forms/models.py" in _construct_form
  564.             pk = self.data[pk_key]
File "/usr/local/lib/python2.7/dist-packages/django/utils/datastructures.py" in __getitem__
  301.             raise MultiValueDictKeyError(repr(key))

Exception Type: MultiValueDictKeyError at /admin/knowledge/sba/1/
Exception Value: "u'answer_set-0-id'"

我在 google 和 stackoverflow 上搜索了类似的请求,并且我的 django 包是完全最新的(包括其他答案中建议的管理内联模板)。将不胜感激任何帮助。谢谢

P.S 这几乎可以肯定是一个错误,因为我可以在使用类似的多对一关系模型的官方 django“投票”教程中复制该问题。

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    在 Django

    错误:

    class Answer(models.Model):
        id = IntegerField(primary_key=True)
    

    正确:

    class Answer(models.Model):
        id = AutoField(primary_key=True)
    

    https://code.djangoproject.com/ticket/15665

    【讨论】:

      【解决方案2】:

      我有类似的问题,已通过更新 django-grappelli 解决。如果您没有使用它,请检查您的软件包,也许您会发现什么会影响管理站点的工作。

      pip freeze | grep django- 将显示当前包的版本

      【讨论】:

      • 知道是什么原因造成的,因为我看到了同样的错误,但我没有使用 Grappeli。我觉得这与基于类的视图/混合有关。
      【解决方案3】:

      这个答案https://stackoverflow.com/a/20246225/554807有解释。

      最好的解决方法实际上是获取 silverfix 的嵌套内联分支:https://github.com/silverfix/django-nested-inlines

      这具有该答案中提到的修复以及其他问题。

      【讨论】:

        【解决方案4】:

        将应用程序从 Django==1.4.20 迁移到 Django==1.8.3 后,我有一个过时的 templates_django/admin/edit_inline/stacked.html 和 templates_django/admin/edit_inline/tabular.html 文件。 所以我刚刚删除了它们,现在一切正常。 您也可以将它们升级到您当前的 django 版本而不是删除。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-31
          • 2012-04-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多