繁体   English   中英

Django:上传前调整图片大小

[英]Django: resize image before upload

我想在上传前调整图片大小( Pillow ),我在下面编写代码但不起作用! 并得到错误:

/ myapp / list /的AttributeError

_committed

请求方法:POST

请求URL: http//127.0.0.18000 / myapp / list / Django版本:1.8异常类型:AttributeError异常值:

_committed

例外地点:

/usr/local/lib/python3.4/dist-packages/Pillow-2.8.1-py3.4-linux-x86_64.egg/PIL/Image.py

getattr中 ,第622行Python可执行文件:/usr/bin/python3.4 Python版本:3.4.0

views.py

def list(request):
# Handle file upload
if request.method == 'POST':
    form = DocumentForm(request.POST, request.FILES)
    if form.is_valid():
        imga = request.FILES['docfile']
        size = (600, 400)
        im = Image.open(imga)
        imga = im.resize(size)
        request.FILES['docfile'] = imga
        newdoc = Document(docfile = request.FILES['docfile'], namefile=request.POST['namefile'])
        newdoc.save()

        # Redirect to the document list after POST
        return HttpResponseRedirect(reverse('myproject.myapp.views.list'))
else:
    form = DocumentForm() # A empty, unbound form

# Load documents for the list page
documents = Document.objects.all()

# Render list page with the documents and the form
return render_to_response(
    'myapp/list.html',
    {'documents': documents, 'form': form},
    context_instance=RequestContext(request)
)
from PIL import Image
from io import BytesIO
from django.core.files.base import ContentFile
from resizeimage import resizeimage

class SomeModel(models.Model):
    image = models.ImageField(upload_to=your_get_file_path_callback)

    def save(self, *args, **kwargs):
        pil_image_obj = Image.open(self.image)
        new_image = resizeimage.resize_width(pil_image_obj, 100)

        new_image_io = BytesIO()
        new_image.save(new_image_io, format='JPEG')

        temp_name = self.image.name
        self.image.delete(save=False)  

        self.image.save(
            temp_name,
            content=ContentFile(new_image_io.getvalue()),
            save=False
        )

        super(SomeModel, self).save(*args, **kwargs)

用于调整大小的PS我使用了'python-image-resize'https: //github.com/charlesthk/python-resize-image

对于图像大小调整,您可以使用djanof easy thumbnail库。

下面是我在项目中使用的示例代码

options = {'size': (200, 200), 'crop': True}
thumb_url =get_thumbnailer(image path).get_thumbnail(options).url

供参考https://github.com/SmileyChris/easy-thumbnails

有一些有用的答案,但您可能想了解当前代码发生了什么。

您的代码因此行而引发该异常:

request.FILES['docfile'] = imga

这有什么问题? 您正在影响枕头Image对象到django ImageField元素。 这是两种不同的类型,当您调用Document构造函数时,它可能希望找到包含_committed属性的文件表单字段。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM