Загрузка / обработка файлов в Django - PullRequest
0 голосов
/ 16 ноября 2011

Я работал над этим в течение 3 дней подряд, и я в своем уме.Мне нужен кто-то, чтобы объяснить буквально шаг за шагом, что именно происходит в этом процессе и каковы фактические данные (или как они выглядят) на каждом шаге.

У меня есть модель с ImageField ()внутри него.У меня есть форма, основанная на этой модели.Я передаю форму в шаблон, этот шаблон передает заполненные данные формы в представление.Затем я привязываю данные request.FILES к экземпляру модели / формы и сохраняю их.

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

После того как я проверил данные, я передаю данные request.FILES ['file'] в функцию, и внутри этой функции PIL открываетданные.Он открывается нормально, каждый раз, когда у меня нет проблем с PIL, который видит эти данные непосредственно из файла InMemory.Однако я не могу заставить PIL выводить эти отредактированные данные в то, что Django ищет в своем ImageField ().Я в основном хочу взять эти загруженные данные, изменить их размер, переименовать, а затем сохранить их через ImageField () и позволить Django обрабатывать их оттуда.

Представление:

if request.method == "POST":
    user_form = EditUserProfile(request.POST, instance=User.objects.get(id=request.user.id))
    siteprofile_form = EditSiteProfile(request.POST, request.FILES, instance=SiteProfile.objects.get(user=request.user))
    if user_form.is_valid() and siteprofile_form.is_valid():
        user_form.save()
        temp_siteprofile = siteprofile_form.save(commit=False)
        temp_siteprofile.profile_image = process_image_string(request.FILES['profile_image'], (100, 100))
        temp_siteprofile.save()
        return user_profile(request, request.user.username)

функция:

def process_image_string(f, size):
    f_image = Image.open(f)
    f_image = f_image.resize(size)
    output = StringIO()
    f_image.save(output, "JPEG")
    return output

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

1 Ответ

1 голос
/ 16 ноября 2011

Попробуйте попробовать django-stdimage.Он является расширением ImageField и изменит размер изображения для вас, вот пример фрагмента:

class MyClass(models.Model):
    image1 = StdImageField(upload_to='path/to/img') # works as ImageField
    image2 = StdImageField(upload_to='path/to/img', blank=True) # can be deleted through admin
    image3 = StdImageField(upload_to='path/to/img', size=(640, 480)) # resizes image to maximum size to fit a 640x480 area
    image4 = StdImageField(upload_to='path/to/img', size=(640, 480, True)) # resizes image to 640x480 croping if necessary

    image_all = StdImageField(upload_to='path/to/img', blank=True, size=(640, 480), thumbnail_size=(100, 100, True)) # all previous features in one declaration

При этом вы можете напрямую сохранить вашу ModelForm EditUserProfile и вам не нужнолюбое манипулирование имиджем самостоятельно.Недостатком является то, что эта библиотека использует PIL.

Google Code: http://code.google.com/p/django-stdimage/

Github: https://github.com/humanfromearth/django-stdimage

...