2015-03-30 55 views
0

我有一個約10個領域3其中是filefields的形式。我得到錯誤MultiValueDictKeyError,如果我沒有上傳我的Django形式的所有3個文件區

當我創建新記錄時,沒問題。 當我更新所有字段時,沒問題。 當我只更新3個文件字段而沒有其他字段時,沒有問題。 但是,如果我在模板中留下一個空的文件空間,我會得到MultiValueDictKeyError。 這不是很酷,因爲我希望用戶能夠上傳或更新他們喜歡的任何字段,無論是1或3還是所有字段。

我到處搜索過,我無法看到這個確切的問題出現在任何地方。任何幫助將非常感激。

請原諒我很長的代碼。我是一名初學者。 形式是這樣的......

class DocumentForm(forms.Form): 
price= forms.IntegerField(max_value=1000, min_value=1, 
          label='1. Set Price in $', 
          help_text='*') 

docfile = forms.FileField(allow_empty_file= True, 
    label='3 Upload file 1', 
    help_text='*') 

docfile1 = forms.FileField(allow_empty_file= True, 
    label='2. Upload file2', 
    help_text='*') 

docfile2=forms.FileField(allow_empty_file= True, 
    label='4. Upload a file ', 
    help_text='*') 

name= forms.CharField(widget=forms.TextInput,help_text='*') 

description=forms.CharField(widget=forms.Textarea,help_text='*') 

RADIO_CHOICES = (
    ('none', "No Category"), 
    ('one', "Music"), 
    ('two', "Movie"), 
    ('three', "Tutorial "), 
) 
category=forms.ChoiceField(
    choices=RADIO_CHOICES, 
    widget=forms.RadioSelect(), 
    label ='7. Select a Category for your upload', 
    required=False, 
    initial=False, 
    ) 

isover18s = forms.BooleanField(
    label='8. Is over 18 content advised?', 
    required=False, 
    initial=False 
) 

模式是這樣的......

class Document(models.Model): 

docfile1 =models.FileField(blank=True,null=True,upload_to= 'MEDIA_ROOT/documents/%Y/%m/%d',) 
docfile = models.FileField(blank=True,null=True,upload_to= 'MEDIA_ROOT/documents/%Y/%m/%d',) 
docfile2 =models.FileField(blank=True, null=True,upload_to= 'MEDIA_ROOT/documents/%Y/%m/%d',) 

category= models.CharField(max_length=100, null=False, blank=False) 
usersname =models.CharField(max_length=100, null=False, blank=False) 
name= models.CharField(max_length=100, null=False, blank=False) 
description=models.CharField(max_length=300, null=False, blank=False) 
isover18s =models.BooleanField(default=False, verbose_name = "Over 18 Content advised?") 

price=models.IntegerField(verbose_name="Price is in Dollars MAX is $999") 
dateUploaded=models.DateTimeField(auto_now_add=True, auto_now=False) 
preview_views=models.IntegerField(verbose_name="Pre Views") 
views=models.IntegerField(verbose_name="Views") 

的觀點很長篇大論,因爲其他視圖使用不同的目的相同的形式和我不好。無論如何這是這樣的...

def edit_preview(request, document_id): 

    if request.method == 'POST': 
     form = DocumentForm(request.POST, request.FILES) 
     form.fields['docfile'].required = False 
     form.fields['docfile1'].required = False 
     form.fields['docfile2'].required = False 
     form.fields['category'].required = False 
     form.fields['price'].required = False 
     form.fields['description'].required = False 
     form.fields['name'].required = False 

     if form.is_valid(): 

      newdoc = Document.objects.get(id=document_id) 
      newdoc.usersname = request.user.username     

      newdoc = Document(docfile = request.FILES['docfile']) 
      if newdoc.docfile: 
       myfile=newdoc.docfile 

      newdoc = Document(docfile1 = request.FILES['docfile1']) 
      if newdoc.docfile1: 
       myfile1=newdoc.docfile1 

      newdoc = Document(docfile2 = request.FILES['docfile2']) 
      if newdoc.docfile2: 
       myfile2= newdoc.docfile2 

      newdoc = Document.objects.get(id=document_id) 
      newdoc.usersname = request.user.username 

      if myfile: 
       newdoc.docfile = myfile 
      if myfile: 
       newdoc.docfile1 = myfile1 
      if myfile: 
       newdoc.docfile2 = myfile2 

      newdoc.price=request.POST.get('price','') 
      newdoc.category= request.POST.get('category','') 
      newdoc.isover18s =request.POST.get('isover18s','') 
      newdoc.name =request.POST.get('name','') 
      newdoc.description =request.POST.get('description','') 

      form.clean_content() 
      if myfile: 
       newdoc.save(update_fields=['docfile']) 
      if myfile1: 
       newdoc.save(update_fields=['docfile1']) 
      if myfile2: 
       newdoc.save(update_fields=['docfile2']) 
      if request.POST.get('price'): 
       newdoc.save(update_fields=['price']) 
      if request.POST.get('category'): 
       newdoc.save(update_fields=['category']) 
      if request.POST.get('isover18s'): 
       newdoc.save(update_fields=['isover18s']) 
      if request.POST.get('name'): 
       newdoc.save(update_fields=['name']) 
      if request.POST.get('description'): 
       newdoc.save(update_fields=['description']) 

    document = Document.objects.get(id=document_id) 
    form = DocumentForm() 
    return render_to_response(
     'edit_preview.html', 
     {'document': document, 'form': form}, 
     context_instance=RequestContext(request) 
    ) 

該模板的形式太大,凌亂,我似乎無法得到它粘貼正確。希望有人能幫忙。

萬分感謝@knbk 這是我改變了看法,以和它的作品現在100%......

def edit_preview(request, document_id): 

    if request.method == 'POST': 
     form = DocumentForm(request.POST, request.FILES) 
     form.fields['docfile'].required = False 
     form.fields['docfile1'].required = False 
     form.fields['docfile2'].required = False 
     form.fields['category'].required = False 
     form.fields['price'].required = False 
     form.fields['description'].required = False 
     form.fields['name'].required = False 

     if form.is_valid(): 

      newdoc = Document.objects.get(id=document_id) 
      newdoc.usersname = request.user.username     


      if request.FILES.get('docfile'): 
       myfile=request.FILES.get('docfile') 
      else: 
       myfile=None 

      if request.FILES.get('docfile1'): 
       myfile1=request.FILES.get('docfile1') 
      else: 
       myfile1=None 

      if request.FILES.get('docfile2'): 
       myfile2=request.FILES.get('docfile2') 
      else: 
       myfile2=None 

      if myfile: 
       newdoc.docfile = myfile 
      if myfile1: 
       newdoc.docfile1 = myfile1 
      if myfile2: 
       newdoc.docfile2 = myfile2 


      newdoc.price=request.POST.get('price','') 
      newdoc.category= request.POST.get('category','') 
      newdoc.isover18s =request.POST.get('isover18s','') 
      newdoc.name =request.POST.get('name','') 
      newdoc.description =request.POST.get('description','') 

      form.clean_content() 
      if myfile: 
       newdoc.save(update_fields=['docfile']) 
      if myfile1: 
       newdoc.save(update_fields=['docfile1']) 
      if myfile2: 
       newdoc.save(update_fields=['docfile2']) 
      if request.POST.get('price'): 
       newdoc.save(update_fields=['price']) 
      if request.POST.get('category'): 
       newdoc.save(update_fields=['category']) 
      if request.POST.get('isover18s'): 
       newdoc.save(update_fields=['isover18s']) 
      if request.POST.get('name'): 
       newdoc.save(update_fields=['name']) 

      if request.POST.get('description'): 
       newdoc.save(update_fields=['description']) 

      p =request.POST.get('docfile') 


    document = Document.objects.get(id=document_id) 
    form = DocumentForm() 
    return render_to_response(
     'edit_preview.html', 
     {'document': document, 'form': form}, 
     context_instance=RequestContext(request) 
    ) 

回答

1
newdoc = Document(docfile = request.FILES['docfile']) 
... 

newdoc = Document(docfile1 = request.FILES['docfile1']) 
... 

newdoc = Document(docfile2 = request.FILES['docfile2']) 

這將引發MultiValueDictKeyError如果該鍵不存在。使用默認值request.FILES.get()

+0

你的意思是這樣的... newdoc = request.FILES.get('docfile') – user3250052 2015-03-31 00:21:11

+0

是的,確切地說。 'MultiValueDict'(request.FILES')實現'dict'所有的方法。 – knbk 2015-03-31 00:26:09

+0

太好了。這工作,但現在我得到nMemoryUploadedFile'對象沒有屬性'docfile'的行'如果newdoc.docfile:'那麼如何檢查是否有文件上傳?非常感謝您的幫助 – user3250052 2015-03-31 00:35:29

相關問題