2017-07-06 71 views
0

出於某種原因,在django中,我嘗試使用的表單不​​被認爲是有效的。這些代碼幾乎直接來自一個聲稱它可以工作但仍然不起作用的網站。我的代碼如下 。Django Image Upload Form無效

VIEWS

def display_update_image(request, pk): 
if request.method == 'POST': 
    form = ImageForm(request.POST, request.FILES) 
    if form.is_valid(): 
     display = Display.objects.get(pk = pk) 
     display.image = form.cleaned_data['image'] 
     display.save() 
    return HttpResponseRedirect(reverse('displays')) 
else : 
    form = ImageForm() 
return render(request, 'catalog/update_display_image.html', {'form': form}) 

template(模板名稱是update_display_image.html)

<form method = "post" enctype = "multipart/form-data">{% csrf_token %} 
<p> 
    <input id = "id" type = "file" class = "" name = "image"> 
</p> 
<input type = "submit" value = "Submit" /> 

模型

class Display(models.Model): 
    title = models.CharField(max_length = 50,) 
    image = models.ImageField(upload_to = 'images') 
    id = models.UUIDField(primary_key = True, default = uuid.uuid4, unique = True) 

    def __str__(self): 
     return self.title 

編輯:忘記郵表單代碼對不起

class ImageForm(forms.Form): 
    image = forms.ImageField() 

進一步編輯:改變我的表格類這

class ImageForm(forms.Form): 
    class Meta: 
     model = Display 
     fields = ('image',) 

允許讀取爲有效出於某種原因,儘管我不明白爲什麼形式。不幸的是,導致我的觀點方法,是無法正常工作,因爲它可以不再閱讀

display.image = form.cleaned_data['image'] 
+0

你可以發表「ImageForm」的代碼嗎? –

+0

與模型的窗體類應該是類ImageForm(forms.ModelForm):' –

回答

2

如果你的窗體類是的ModelForm:class ImageForm(forms.ModelForm):您可以將實例傳遞給表單並保存。

def display_update_image(request, pk): 
    if request.method == 'POST': 
     display = Display.objects.get(pk = pk) 
     form = ImageForm(request.POST, request.FILES, instance=display) 
     if form.is_valid(): 
      form.save() 
     return HttpResponseRedirect(reverse('displays')) 
    else : 
     form = ImageForm() 
    return render(request, 'catalog/update_display_image.html', {'form': form}) 
+0

此方法運行良好。謝謝您的幫助! – user8265778

+0

不客氣! –

0

forms.py檢查你有一個Django表單像這樣的:

class ImageForm(forms.ModelForm): 
    class Meta: 
     model = Display 
     fields = ['image',] 

template添加{{ form }}代替使用input手動,像這樣的:

<form method='post' enctype='multipart-formdata> 
{% csrf_token %} 
{{ form }} 
<input type='submit' value='Update Image'> 
+0

啊對不起,我忘了提及我有一個類似的形式,一旦我更新這兩個文件是一樣的,你提到它讀取該表格是有效的。不幸的是,一旦我點擊提交,它就不會從我的視圖中識別出 form.cleaned_data ['image']。 – user8265778

+0

@ user8265778你可以粘貼你收到的錯誤嗎? –

+0

KeyError at/catalog/display/97ee7328-ccda-447d-b454-2ac53b0bf831/update-image/ 異常位置是我提到的行 – user8265778