编辑内联管理对象时的MultiValueDictKeyError

时间:2014-01-10 00:14:35

标签: django django-admin

我正在使用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这几乎肯定是一个错误,因为我可以在使用类似的ManyToOne关系模型的官方django“民意调查”教程中复制问题。

4 个答案:

答案 0 :(得分:1)

我有类似的问题,这是由更新django-grappelli解决的。如果您没有使用它,请检查您的软件包,也许您会发现可能影响管理站点工作的内容。

pip freeze | grep django-会显示当前包含版本

的包

答案 1 :(得分:1)

在Django< = 1.7.3中,我需要将模型的主键字段更改为AutoField:

<强>错误:

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 :(得分:0)

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

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

这有答案中提到的修复,以及其他。

答案 3 :(得分:0)

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