【发布时间】:2017-05-12 17:23:45
【问题描述】:
Django:图片上传问题
Python:3.5
Django:1.11
我正在编写一个简单的新闻应用程序,它将图片作为文章的一部分。我选择使用 Django Forms 提供的clean_(field name) 函数修改图像,创建一个缩略图存储在表单中。
我遇到的问题是,在完成提交和clean_image 函数之后,ImageField 验证将我踢回来,并显示file extension " is not allowed 的错误。
我知道问题来自clean_image 函数,因为我保存了 PIL 图像,然后将其交还给 Django ContentFile 进行处理。任何帮助都会很棒。
表格:
from django.conf import settings
from django.core.files.base import ContentFile
from django.utils.translation import ugettext_lazy as _
from .models import News
from ironcsd.validators import MimetypeValidator
from datetime import date
from PIL import Image, ImageEnhance
from io import StringIO, BytesIO
import hashlib, mimetypes
import os, io
import logging, logging.config
logger = logging.getLogger(__name__)
class NewsForm(forms.ModelForm):
class Meta:
model = News
widgets = {
'details': forms.Textarea(attrs={'id': 'smde-editor'}),
}
fields = ('title','details','image')
def clean_image(self):
image = self.cleaned_data.get('image')
md5 = hashlib.md5()
md5.update(repr(image.name).encode('utf-8'))
file_name = md5.hexdigest()
if image._size > 30 * 1024 * 1024:
raise forms.ValidationError(_('File is too big.'), code='invalid')
image = Image.open(image)
if image.size[0] < 1024 or image.size[1] < 1024:
raise forms.ValidationError(_('Your image needs to be at least 1024x1024.'))
image.thumbnail([1024,1024], Image.ANTIALIAS)
image_string = io.BytesIO()
image.save(image_string, image.format)
image = ContentFile(image_string.getvalue(), file_name)
return image
型号:
from django.db import models
from django.urls import reverse, reverse_lazy
from ironcsd.models import Audit
class News(Audit):
title = models.CharField(max_length=255)
details = models.TextField()
image = models.ImageField(upload_to='news/%Y/%m/')
class Meta:
verbose_name_plural = "news"
def __str__(self):
return self.title
【问题讨论】:
-
去掉cleaned_data,尝试正常获取图片,看看错误是否依旧
标签: python django forms pillow