2013-11-02 98 views
8

UPDATEMultiValueDictKeyError在Django管理

型號:

class PicturesManager(models.Manager): 
    def create_pictures(self, flat, img): 
     pictures = self.create(car=car, image=img) 
     return pictures 

def get_file_path(instance, filename): 
    filename = "%s.%s" % (uuid.uuid4(), filename.split('.')[-1]) 
    return os.path.join('car_img/', filename) 

class Pictures(models.Model): 
    car = models.ForeignKey(Car, verbose_name="Car Image", related_name='pictures') 
    image = models.ImageField(verbose_name="Photo", upload_to = get_file_path, max_length=64) 
    objects = PicturesManager() 
    def __unicode__(self): 
     return str(self.id) 

管理:

class MyInlineModelAdmin(admin.TabularInline): 
    model = Pictures 
    extra = 3 
class CarOptionsInline(admin.StackedInline): 
    model = CarOptions 

class WatchesInline(admin.StackedInline): 
    model = Watches 

class CarAdmin(admin.ModelAdmin): 
    inlines = [CarOptionsInline, WatchesInline, MyInlineModelAdmin] 

當我在管理編輯車,我有錯誤:MultiValueDictKeyError在.. 「u'pictures-0-ID'」

回溯:

Environment: 


Request Method: POST 
Request URL: http://127.0.0.1:8000/admin1/cars/car/1/ 

Django Version: 1.6c1 
Python Version: 2.7.5 
Installed Applications: 
('django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.sites', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'django.contrib.sitemaps', 
'cars', 
'django.contrib.admin') 
Installed Middleware: 
('django.middleware.common.CommonMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware') 


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 
    430.     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 
    1227.    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 
    839.   form = super(BaseInlineFormSet, self)._construct_form(i, **kwargs) 
File "/usr/local/lib/python2.7/dist-packages/django/forms/models.py" in _construct_form 
    555.    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 /admin1/cars/car/1/ 
Exception Value: "u'pictures-0-id'" 

如何解決呢?我使用Django 1.6c1。

謝謝!

+0

告訴我們'CarOptionsInline,WatchesInline,MyInlineModelAdmin'模型 – lalo

+0

是錯誤的後面添加'inline's? – lalo

+0

@lalo我已更新信息 – tim

回答

1

答:更新管理模板。

+0

你如何「更新管理模板」? – GreenAsJade

+0

刪除舊的,安裝新的 – tim

+0

你是說「升級你的django版本」,還是其他一些建議? IE你從哪裏推薦獲得一個可用的新管理模板? – GreenAsJade

18

我認爲這是關係到一個Django 1.6票

#ticket 13696 -- ensured inline pk field is rendered

必須更新以下管理模板:

  • stacked.html
  • tabular.html

刪除一行:

{% if inline_admin_form.has_auto_field %}{{ inline_admin_form.pk_field.field }}{% endif %} 

,並添加行:

{% if inline_admin_form.needs_explicit_pk_field %} 
    {{ inline_admin_form.pk_field.field }} 
{% endif %} 
+0

這爲我修好了,謝謝! –

+0

謝謝!添加第二個代碼塊用自定義模板覆蓋解決了我的問題;升級到1.10後我的模板已經過時了 – ptim

1

什麼固定對我來說是更新格拉佩利到2.5.1(假設你使用格拉佩利OFC)。我想這是因爲它執行特定的管理模板更新。

pip install django-grappelli==2.5.1 
2

Django的< = 1.7.3,也確保,你的內聯模式的主鍵字段是一個下拉列表AutoField:

錯誤:

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

正確的:

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

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

11

如果你已經在Django上的一個新版本,仍然可以得到這一點,請確保您的非下拉列表AutoField PK在模型定義「編輯=假」。

+0

這是此線程中唯一正確的答案! :-) – physicalattraction

+0

是的!這固定它,嘗試了許多超級複雜的解決方案,就是這樣。謝謝 – schlow

+0

解決了Django 1.10的問題。乾杯! – MPowerKC