2015-05-06 46 views
0

我有一篇文章應用程序,在我向其添加圖像字段headimage之前,它曾經工作得很好。爲什麼我在Django中得到MultiValueDictKeyError?

這裏是模型:

class Article(models.Model): 
    nid = models.IntegerField(default=0) 
    headimage = ImageWithThumbsField(upload_to='images', blank=True, sizes=((200,200),(400,400)) 
    title = models.CharField(max_length=100) 
    author = models.CharField(max_length=100, blank=True) 
    translator = models.CharField(max_length=100, blank=True) 
    body = models.TextField() 
    teaser = models.TextField('teaser', blank=True) 
    created=models.DateTimeField(default=datetime.datetime.now) 
    pub_date=models.DateTimeField(default=datetime.datetime.now) 
    categories = models.ManyToManyField(Category, blank=True) 
    slug = models.CharField(max_length=100, blank=True) 
    tags = TaggableManager() 

的觀點:

#@staff_member_required 
def add_article(request): 
    if request.method == 'POST': 
     dform = ArticleForm(request.POST, request.FILES) 
     if dform.is_valid(): 
      form = Article(headimage = request.FILES['headimage'])   
      form.save(commit=False) 

      form.user = request.user 
      form.save() 
      form.save_m2m() 

      messages.info(request, "article was added") 
      #args = {} 
      post = Article.objects.latest('id') 
      post_slug = post.slug 
      return redirect('article.views.post_withslug', post_slug=post_slug) 
     else: 
      print "form not valid" 

    if request.method == 'GET': 
     form = ArticleForm() 
     args = {} 
     args.update(csrf(request)) 
     args['form'] = form 
     return render(request, 'article/add_article.html', args)  

而且模板:

<form action="{% url "article.views.add_article" %}" method="post">{% csrf_token %} 
<div class="form-group"> 
    <label>Head Image</label> 
    <input type="file" id="id_headimage" name="headimage" > 
    </div> 

<div class="form-group"> 
    <label>Title</label> 
    <input id="id_title" maxlength="100" name="title" type="text"> 
    </div> 

    <div class="form-group"> 
    <label>Author</label> 
    <input id="id_author" maxlength="100" name="author" type="text"> 
    </div> 

    <div class="form-group"> 
    <label>Translator</label> 
    <input id="id_translator" maxlength="100" name="translator" type="text"> 
    </div> 

     <div class="form-group"> 
    <label>Body</label> 
    {% include "texteditor.html" %} 
     <textarea id="id_body" name="body" rows="20" cols="180"></textarea> 
    </div> 

     <div class="form-group"> 
    <label>tags</label> 
     <input id="id_tags" maxlength="100" name="tags" type="text"> 
    </div> 


<input type="submit" name="submit" value="Update" /> 
</div> 

</form> 

值得關注的是 1.像場使用this出色的圖像調整我在其他地方成功使用的代碼片段。 2.即使沒有圖像張貼在表單中,我也會收到錯誤信息。

我已經嘗試了不同的視圖技巧,但在這個股票上好幾個小時。感謝您的幫助。

更新:這裏是引用:

環境:

Request Method: POST 
Request URL: http://127.0.0.1:8000/add/article 

Django Version: 1.8 
Python Version: 2.7.3 
Installed Applications: 
('django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'contact', 
'captcha', 
'article', 
'debug_toolbar', 
'userpics', 
'taggit') 
Installed Middleware: 
(u'debug_toolbar.middleware.DebugToolbarMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware', 
'django.middleware.security.SecurityMiddleware') 


Traceback: 
File "/home/randi/.env/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 
    132.      response = wrapped_callback(request, *callback_args, **callback_kwargs) 
File "/home/randi/proj1/article/views.py" in add_article 
    90.    form = Dastan(headimage = request.FILES['headimage'])   
File "/home/randi/.env/local/lib/python2.7/site-packages/django/utils/datastructures.py" in __getitem__ 
    322.    raise MultiValueDictKeyError(repr(key)) 

Exception Type: MultiValueDictKeyError at /add/article 
Exception Value: "'headimage'" 
+0

您可以發佈完整的追溯,如果可用的文本編輯模板。 –

+0

@ C.B。我剛添加了引用。 – Jand

回答

2

你錯過了在HTML表單標籤enctype="multipart/form-data"均爲必填字段。否則,瀏覽器不會發送任何文件數據。

然而,你不應該引用request.POSTrequest.FILES http://stardict.sourceforge.net/Dictionaries.php下載直接在您的觀點:那就是形式是什麼:

dform = ArticleForm(request.POST, request.FILES) 
    if dform.is_valid(): 
     article = dform.save(commit=False) 

     article.user = request.user 
     article.save() 
     dform.save_m2m() 
+0

非常感謝丹尼爾。提示解決了我的問題! – Jand

+0

這段代碼片段是做什麼或不做的一個例子嗎?哪個函數應該執行'form.save()'? – Hatshepsut

1

我不知道這是否會解決這個問題,不過,我可以看到你正確保存表單。無論發佈的數據如何,您都在初始化新對象。而我看到的是你必須在你的模型

dform = ArticleForm(request.POST, request.FILES) 
if dform.is_valid(): 

    ## In here you are creating a new object and try to save it. 
    # title, body are mandatory which will cause a crash 
    form = Article(headimage = request.FILES['headimage'])   
    form.save(commit=False) 
    form.user = request.user 
    form.save() 
    form.save_m2m() 


    # you should take the instance from the form. 
    form = dform.save(commit=False) 
    form.user = request.user 
    form.save() 
    form.save_m2m() 
+0

除了丹尼爾點是關於加密類型。 – Othman