django: отказался от загрузки пользователем своего аватара. Изображение не сохраняется. Нужна помощь! - PullRequest
0 голосов
/ 19 мая 2011

Я очень старался, но не смог. Я пытаюсь найти способ, как пользователь может загрузить свое изображение аватара, используя django, и это мой код:

settings.py

USER_IMAGE_PATH = '/site_media/user_data/images/'

models.py

fs = FileSystemStorage(location=settings.USER_IMAGE_PATH)

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    avatar = models.ImageField(storage=fs, upload_to=settings.USER_IMAGE_PATH)

forms.py

class ProfileForm(forms.Form):
    avatar = forms.ImageField(label='avatar', required=False)

urls.py

(r'^profile/(\w+)/$', profile_form),

views.py

@login_required
def profile_form(request, username):
    form = ProfileForm(request.POST, request.FILES)
    try:
        user = User.objects.get(username=username)
    except User.DoesNotExist:
        raise Http404(u'User not Found')
    if form.is_valid():
        avatar = form.cleaned_data['avatar']
        profile = user.get_profile()
        profile.avatar = avatar
        if not avatar:
            pass
        else:
            image_file = request.FILES['avatar']
            im = imageilb()
            filename, content = im.handle_uploaded_image(image_file)
            profile.avatar.save(filename, content)

imagelib.handle_uploaded_image ()

import hashlib
from PIL import Image
import os.path
import StringIO
import django

def handle_uploaded_image(self,i):
    # resize image
    imagefile  = StringIO.StringIO(i.read())
    imageImage = Image.open(imagefile)

    (width, height) = imageImage.size
    (width, height) = self.scale_dimensions(width, height, longest_side=240)

    resizedImage = imageImage.resize((width, height))

    imagefile = StringIO.StringIO()
    resizedImage.save(imagefile,'JPEG')
    filename = hashlib.md5(imagefile.getvalue()).hexdigest()+'.jpg'

    # #save to disk - hardcoding of paths will be removed as soon as this thing works
    imagefile = open(os.path.join('/site_media/user_data/images',filename), 'w')
    resizedImage.save(imagefile,'JPEG')
    imagefile = open(os.path.join('/site_media/user_data/images',filename), 'r')
    return filename, django.core.files.File(imagefile)

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

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 19 мая 2011

Надеюсь, мое предложение будет полезным для вас

settings.py

USER_IMAGE_PATH = '/site_media/user_data/images/'

models.py

fs = FileSystemStorage(location=settings.USER_IMAGE_PATH)
class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    avatar = models.ImageField(storage=fs, upload_to='avatar')

    def save(self, *args, **kwargs):
       super(UserProfile, self).save(*args, **kwargs)
       if self.avatar:
           imglib.resize_image(avatar)

imglib.py

from PIL import Image

def resize_image(avatar, size=(200,200)):
    image = Image.open(avatar.path)
    image.resize(size, Image.ANTIALIAS).save(avatar.path, 'JPEG', quality=75)

views.py

@login_required
def profile_form(request, username):
    form = ProfileForm(request.POST, request.FILES)
    try:
        user = User.objects.get(username=username)
    except User.DoesNotExist:
        raise Http404(u'User not Found')
    if form.is_valid():
        avatar = form.cleaned_data['avatar']
        profile = user.get_profile()
        profile.avatar = avatar
        profile.save()
0 голосов
/ 19 мая 2011

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

т.е.

'/site_media/...'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...