2014-09-22 84 views
2

我在我的Django項目與化身領域的用戶模型:如何使靜態圖像的縮略圖使用SORL-縮略圖

class User(AbstractBaseUser): 

    avatar = models.ImageField(
     null=True, 
     blank=True, 
     upload_to='user/avatar/', 
    ) 

不是必需的化身,所以我想用一個如果用戶尚未上傳默認圖片。在另一方面,我不想爲了使用default參數可以改變默認的頭像在未來爲所有用戶:

class User(AbstractBaseUser): 

    avatar = models.ImageField(
     null=True, 
     blank=True, 
     default='defaults/no-avatar.png', 
     upload_to='user/avatar/', 
    ) 

所以我最後寫一個get_avatar方法返回一個圖像如果化身存在或默認的靜態圖像的路徑:

@property 
def get_avatar(self): 
    if self.avatar: 
     return self.avatar 
    return '{0}defaults/no-avatar.png'.format(settings.STATIC_URL) 

但在這種情況下sorl-thumbnail不生成縮略圖的默認圖像

{% thumbnail user.get_avatar "46x46" crop="center" as im %} 
    <img title="{{ user }}" src="{{ im.url }}" class="img-circle" /> 
{% endthumbnail %} 

,並返回以下錯誤:

ERROR 2014-09-22 12:49:48,020 thumbnail :: Thumbnail tag failed: 
Traceback (most recent call last): 
    File "/Users/vera/.virtualenvs/my_app/lib/python2.7/site-packages/sorl/thumbnail/templatetags/thumbnail.py", line 45, in render 
    return self._render(context) 
    File "/Users/vera/.virtualenvs/my_app/lib/python2.7/site-packages/sorl/thumbnail/templatetags/thumbnail.py", line 97, in _render 
    file_, geometry, **options 
    File "/Users/vera/.virtualenvs/my_app/lib/python2.7/site-packages/sorl/thumbnail/base.py", line 56, in get_thumbnail 
    source_image = default.engine.get_image(source) 
    File "/Users/vera/.virtualenvs/my_app/lib/python2.7/site-packages/sorl/thumbnail/engines/pil_engine.py", line 12, in get_image 
    buf = StringIO(source.read()) 
    File "/Users/vera/.virtualenvs/my_app/lib/python2.7/site-packages/sorl/thumbnail/images.py", line 121, in read 
    return self.storage.open(self.name).read() 
    File "/Users/vera/.virtualenvs/my_app/lib/python2.7/site-packages/django/core/files/storage.py", line 33, in open 
    return self._open(name, mode) 
    File "/Users/vera/.virtualenvs/my_app/lib/python2.7/site-packages/django/core/files/storage.py", line 159, in _open 
    return File(open(self.path(name), mode)) 
    File "/Users/vera/.virtualenvs/my_app/lib/python2.7/site-packages/django/core/files/storage.py", line 260, in path 
    raise SuspiciousFileOperation("Attempted access to '%s' denied." % name) 

我試圖重寫方法,以便返回而不是圖像:

from django.core.files.images import ImageFile 

@property 
def get_avatar(self): 
    if self.avatar: 
     return self.avatar 
    return ImageFile(open(os.path.join(settings.STATIC_ROOT, 'defaults/no-avatar.png'), 'r')) 

,但我有一個類似的錯誤:

ERROR 2014-09-22 12:52:18,448 thumbnail :: Thumbnail tag failed: 
Traceback (most recent call last): 
    File "/Users/vera/.virtualenvs/my_app/lib/python2.7/site-packages/sorl/thumbnail/templatetags/thumbnail.py", line 45, in render 
    return self._render(context) 
    File "/Users/vera/.virtualenvs/my_app/lib/python2.7/site-packages/sorl/thumbnail/templatetags/thumbnail.py", line 97, in _render 
    file_, geometry, **options 
    File "/Users/vera/.virtualenvs/my_app/lib/python2.7/site-packages/sorl/thumbnail/base.py", line 56, in get_thumbnail 
    source_image = default.engine.get_image(source) 
    File "/Users/vera/.virtualenvs/my_app/lib/python2.7/site-packages/sorl/thumbnail/engines/pil_engine.py", line 12, in get_image 
    buf = StringIO(source.read()) 
    File "/Users/vera/.virtualenvs/my_app/lib/python2.7/site-packages/sorl/thumbnail/images.py", line 121, in read 
    return self.storage.open(self.name).read() 
    File "/Users/vera/.virtualenvs/my_app/lib/python2.7/site-packages/django/core/files/storage.py", line 33, in open 
    return self._open(name, mode) 
    File "/Users/vera/.virtualenvs/my_app/lib/python2.7/site-packages/django/core/files/storage.py", line 159, in _open 
    return File(open(self.path(name), mode)) 
    File "/Users/vera/.virtualenvs/my_app/lib/python2.7/site-packages/django/core/files/storage.py", line 260, in path 
    raise SuspiciousFileOperation("Attempted access to '%s' denied." % name) 
SuspiciousFileOperation: Attempted access to '/Users/vera/workspace/my-website/static/defaults/no-avatar.png' denied. 

回答

2

sorl-thumbnail使用storage functionality。 Django將決定如何以及在何處將文件存儲到file storage system。這是實際理解文件系統,打開和讀取文件等事物的對象。Django附帶了一個django.core.files.storage.FileSystemStorage類,它實現了基本的本地文件系統文件存儲。默認情況下,Django使用MEDIA_ROOT和MEDIA_URL設置在本地存儲文件。

所以在你的情況下,django試圖在MEDIA_ROOT下找到圖像,但是你已經將圖像保存在STATIC_ROOT下。

如何修復

如修補程序可以MEDIA_ROOT下嘗試移動圖像,並會在get_avatar方法改變路徑。 或者您可以嘗試編寫自定義存儲,這將與這兩個文件夾一起使用。 Example custom storage