我正在使用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“民意调查”教程中复制问题。
答案 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)
答案 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版本而不是删除。