django ImageField 解析

2016/5/28 posted in  python

Django ImageField

Django 中的模型层可以直接使用ImageField来指定图片应用。

django 使用ImageFile来控制上传的图片文件,但是这种文件需要安装Pillow。使用pip install Pillow就可以了。

ubuntu 下安装 Pillow

在我的阿里云上面执行的时候发现Pillow安装有比较多的依赖包,否则安装会报错,具体的可以使用

    $ sudo apt-get install libtiff5-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python-tk
    $ sudo apt-get build-dep python-imaging
    $ sudo apt-get install libjpeg8 libjpeg62-dev libfreetype6 libfreetype6-dev
    $ pip install Pillow

官方文档中这么说明

class ImageField([upload_to=None, height_field=None, width_field=None, max_length=100, options])¶

继承了 FileField的所有属性和方法, 但还对上传的对象进行校验,确保它是个有效的image.

除了从FileField继承来的属性外,ImageField 还有宽和 高属性。

为了更便捷的去用那些属性值, ImageField 有两个额外的可选参数

ImageField.height_field¶

该属性的设定会在模型实例保存时,自动填充图片的高度.

ImageField.width_field¶

该属性的设定会在模型实例保存时,自动填充图片的宽度.

ImageField字段需要调用Pillow 库.

ImageField会创建在你的数据库中 和 varchar 一样,默认最大长度为100和其他字段一样, 你可以使用max_length 参数来设置默认文件最大值.

The default form widget for this field is a ClearableFileInput.

使用中说明

在使用中可以看到ImageField有两个参数,height_fieldwidth_field。 这两个参数的作用是将上传的图片的长和宽保存到这个参数定义的字段中。所以这两个参数接受的是字符串类型的字段,而不要输入其他的类型或者变量。

案例如下:

模型层定义:

widthfield = models.IntegerField('widthfiled', default=400)
heightfield= models.IntegerField('heightfield', default=400)
head_image = models.ImageField(upload_to='bookmarks/%Y/%m',width_field='widthfield', height_field='heightfield', null=True, blank=True)

图片前台整理

在setting中设置:

MEDIA_ROOT = BASE_DIR + '/blog/media'
MEDIA_URL = '/media/'

设置相应的url:

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^mshow/', include('mshow.urls', namespace='mshow')),
url(r'^blog/', include('blog.urls', namespace='blog')),
url(r'^comments/', include('django_comments.urls')),
url(r'^media/(?P<path>.*)$', django.views.static.serve,{'document_root': settings.MEDIA_ROOT}) 
]

设置相应的url, 绑定到相应的图片目录