sorl-thumnail изменение размера и сохранение - PullRequest
0 голосов
/ 03 марта 2012

Я пытаюсь использовать sorl-thumnail, чтобы изменить размер изображения в представлениях, затем сохранить его и получить IOError при вызове get_thumnail ().Также мне нужно знать, как сохранить измененное изображение.Извините, если вы считаете это глупым ... Я новичок в Django.

Models.py:

from django.db import models
from django.forms import ModelForm
from sorl.thumbnail import ImageField

class BasicModel(models.Model):
    name = models.CharField(max_length=200)
    dob = models.DateField()
    photo = ImageField(upload_to='sample')

class BasicModelForm(ModelForm):
    class Meta:
            model = BasicModel

Views.py:

def BasicView(request):
    if request.method == 'POST':
            form = BasicModelForm(request.POST, request.FILES)
            if form.is_valid():
                    im = get_thumbnail(request.FILES['photo'], '100x100', crop='center', quality=99)
                    data = form.save()
                    return preview(request, data.id, im)
    else:
            form = BasicModelForm()
    return render_to_response("unnamed.html", {'form': form}, context_instance=RequestContext(request))

def preview(request, id, im):
    obj = get_object_or_404(BasicModel, pk=id)
    return render_to_response("preview.html", {'obj': obj, 'im': im})

preview.html:

{{ obj.name }}
{{ obj.dob }}
{% load thumbnail %}
{% thumbnail im "100x100" as image %}
<img src="{{ image.url }}" width="{{ image.width }}" height="{{ image.height }}">
{% endthumbnail %}

Settings.py:

MEDIA_ROOT = '/home/nirmal/try/files/'
MEDIA_URL = 'http://localhost:8000/files/'

Ошибки:

Exception Type: IOError
Exception Value:    
[Errno 2] No such file or directory: u'/home/nirmal/try/files/wp.jpg'
Exception Location: /usr/local/lib/python2.7/dist-packages/django/core/files/storage.py in _open, line 159
Traceback: im = get_thumbnail(request.FILES['photo'], '100x100', crop='center', quality=99) 

Может ли кто-нибудь помочь мне в этом?Спасибо!

Ответы [ 2 ]

1 голос
/ 04 марта 2012

Вы не можете использовать request.FILES ['photo'] здесь, потому что загруженный файл может быть в памяти или где-то еще. Сначала сохраните этот файл в файловой системе, затем используйте get_thumbnail. Например, вы можете вызвать его на ваших объектах после того, как он будет возвращен form.save ().

0 голосов
/ 04 марта 2012

Если вы хотите получить доступ к загруженному файлу напрямую, сначала вам нужно получить путь к временной памяти, куда он был загружен.

import os
import tempfile

def _file_path(uploaded_file):
    '''  Converts InMemoryUploadedFile to on-disk file so it will have path. '''
    try:
        return uploaded_file.temporary_file_path()
    except AttributeError:
        fileno, path = tempfile.mkstemp()
        temp_file = os.fdopen(fileno,'w+b')
        for chunk in uploaded_file.chunks():
            temp_file.write(chunk)
        temp_file.close()
        return path

Затем вы можете получить доступ к загруженному файлу по пути:

path = _file_path(request.FILES['photo'])
...