Нашел причину, почему выскакивает ошибка, но устранить мне её не получается :(
Суть такова, создается модель "Альбом" в которую добавляются "Фотографии"
from django.db import models
from django.core.urlresolvers import reverse
from django.db.models import permalink
from gallery.fields import ThumbnailImageField
class Album(models.Model):
name = models.CharField(blank=True, max_length=30, verbose_name='Название альбома транслитом')
title = models.CharField(max_length=50, verbose_name='Название альбома')
description = models.TextField(blank=True, verbose_name='Описание альбома')
class Meta:
verbose_name = 'Альбом'
verbose_name_plural = 'альбомы'
ordering = ['name']
def __unicode__(self):
return self.title
class Photo (models.Model):
item = models.ForeignKey(Album)
title = models.CharField(max_length=100, verbose_name='Название фото')
image = ThumbnailImageField(upload_to='static/photos')
caption = models.TextField(blank=True, verbose_name='Описание фото')
class Meta:
verbose_name = 'Фотография'
verbose_name_plural = 'фотографии'
ordering = ['title']
def __unicode__(self):
return self.title
Проблемой, вызывающей страницу 404 является поле image, которое подвязано к ThumbnailImageField из fields.py . Суть fields.py -- создать миниатюру и уменьшить загружаемый файл
from django.db.models.fields.files import ImageField, ImageFieldFile
from PIL import Image
import os
def _add_thumb(s):
"""
Modifies a string (filename, URL) containing an image filename, to insert
'.thumb'
"""
parts = s.split(".")
parts.insert(-1, "thumb")
if parts[-1].lower() not in ['jpeg', 'jpg']:
parts[-1] = 'jpg'
return ".".join(parts)
class ThumbnailImageFieldFile(ImageFieldFile):
def _get_thumb_path(self):
return _add_thumb(self.path)
thumb_path = property(_get_thumb_path)
def _get_thumb_url(self):
return _add_thumb(self.url)
thumb_url = property(_get_thumb_url)
@staticmethod
def _scale_dimensions(width, height, longest_side=800):
if width > height:
koeficent = float(width)/float(longest_side)
width = longest_side
height = int(height/koeficent)
return width, height
elif width < height:
koeficent = float(height)/float(longest_side)
height = longest_side
width = int(width/koeficent)
return width, height
else:
return longest_side, longest_side
def save(self, name, content, save=True):
from datetime import datetime
dt = str(datetime.now()).replace('-','_') .replace(':','') .replace(' ','_')
img_name = 'img_'+dt.split('.')[0]+'.jpg'
super(ThumbnailImageFieldFile, self).save(img_name, content, save)
img = Image.open(self.path)
(width, height) = img.size
if width>800 or height>800:
(width, height) = self._scale_dimensions(width, height)
newImg = img.resize((width, height), Image.ANTIALIAS)
newImg.save(self.path, 'JPEG')
img.thumbnail(
(self.field.thumb_width, self.field.thumb_height),
Image.ANTIALIAS
)
img.save(self.thumb_path, 'JPEG')
def delete(self, save=True):
if os.path.exists(self.thumb_path):
os.remove(self.thumb_path)
super(ThumbnailImageFieldFile, self).delete(save)
class ThumbnailImageField(ImageField):
"""
Behaves like a regular ImageField, but stores an extra (JPEG) thumbnail
image, providing FIELD.thumb_url and FIELD.thumb_path.
Accepts two additional, optional arguments: thumb_width and thumb_height,
both defaulting to 200 (pixels). Resizing will preserve aspect ratio while
staying inside the requested dimensions; see PIL's Image.thumbnail()
method documentation for details.
"""
attr_class = ThumbnailImageFieldFile
def __init__(self, thumb_width=200, thumb_height=200, *args, **kwargs):
self.thumb_width = thumb_width
self.thumb_height = thumb_height
super(ThumbnailImageField, self).__init__(*args, **kwargs)
Если в классе Photo нет поля image, то все нормально, если же есть -- тогда выскакивает ошибка. Т.е. проблема кроется именно в процессе обработки изображения. Но что конкретно идет не так, понять не могу :(
П.С. На локальной машине все работает - файлы изображений уменьшаются и из них создаются миниатюры. На сервере папка photos существует с правами 755
Updated 16 Dec. 2015, 17:06 by oleg_n.