django上传图片,ImageField

今天看django的时候,突然发现model里有个ImageField,原以为django的model只是一个ORM的框架,没想到连上传图片到服务器都可以搞定,于是结合例子尝试了一下。ImageField需要PIL的支持,所以没装PIL这个库的需要先安装。

首先建立两个model:

class Item(models.Model):
    name = models.CharField(max_length=250)
    description = models.TextField()

    class Meta:
        ordering = ['name']

    def __unicode__(self):
        return self.name

    @models.permalink
    def get_absolute_url(self):
        return ('item_detail', None, {'object_id':self.id})

class Photo(models.Model):
    item = models.ForeignKey(Item)
    title = models.CharField(max_length=100)
    image = models.ImageField(upload_to='photos')
    caption = models.CharField(max_length=250, blank=True)

    class Meta:
        ordering = ["title"]

    def __unicode__(self):
        return self.title

    @models.permalink
    def get_absolute_url(self):
        return ('photo_detail', None, {'object_id':self.id})

class PhotoInline(admin.StackedInline):
    model = Photo

class ItemAdmin(admin.ModelAdmin):
    inlines = [PhotoInline]
        

然后在settings.py中加入MEDIA_ROOT:

MEDIA_ROOT = '/var/www/gallery/media/'

由于我是用apache跑的,所以需要注意目录权限。

这里

upload_to=‘photos‘ 这句表示上传的文件会存放在$MEDIA_ROOT/photos/ 下面,也就是放在 /var/www/gallery/media/photos/ 下。

之后一番syncdb,打开admin页面,看到刚才建立的model,添加一条数据,上传图片,成功了,django真是强大!

然后再修改刚才添加的那条记录的修改界面,可以看到刚才上传的图片的超接:

点开图片的超链接,却显示404 not found ,这可奇怪了,在服务器上明明已经有这个文件,并且数据库都添加正确了,怎么读不回来呢。

这里发现有个奇怪的地方,打开的图片url为:http://10.40.3.164:8090/admin/gallery/item/1/photos/github-logo.png/

超链接里面的href值为:photos/github-logo.png,这个有问题啊,图片应该是相对独立的,且不说这里load不到图片,如果真实使用的时候,用这个url肯定不对。

好吧,看下ImageField 的源代码吧。

在django/db/models/fields/files.py 中有:

class ImageField(FileField):

ImageField本身没有什么和 url有关的东西,继续看它的父类: FileField

class FileField(Field):

    # The class to wrap instance attributes in. Accessing the file object off
    # the instance will always return an instance of attr_class.
    attr_class = FieldFile

FileField 中有个属性 attr_class 这里注释说里面属性都是从这里配置的那个类那来的。那我们继续看 FieldFile 类:

class FieldFile(File):
    def _get_url(self):
        self._require_file()
        return self.storage.url(self.name)
    url = property(_get_url)

果然有个叫做 url 的属性,但是这个属性有是通过 storage.url方法返回的。由于是存的文件,那很可能是FileStorage,先look一下吧。

在django/core/files/storage.py
 中有个FileSystemStorage类,其中有个url方法:

    def url(self, name):
        if self.base_url is None:
            raise ValueError("This file is not accessible via a URL.")
        return urljoin(self.base_url, filepath_to_uri(name))

这里的已经比较清楚了,url是由
self.base_url 加上一段文件的filename组成的,这里的 self.base_url 的值是由 MEDIA_URL 这个配置选项决定的,再看下 django/conf/global_setting.py 文件,里面的MEDIA_URL默认为空字符串。

在我们项目的settings.py中加入
MEDIA_URL 这个配置选项:

MEDIA_URL='/media/'

重启apache后,再次打开那条记录的修改页面,这时候通过firebug看到超链接的href属性已经变为 /media/photos/github-logo.png

点击超链接,请求的是 http://10.40.3.164:8090/media/photos/github-logo.png 页面,好吧这就是href属性是否以 “/" 开头的不同。

但是此时还是显示错误,但是问题已经很明显了,和设置静态文件一样,需要在项目的urls.py中加点东西:

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

OK,再试一下,图片果然出来了。

至此,ImageField
已经可以使用了 :-)

时间: 2024-08-08 12:05:37

django上传图片,ImageField的相关文章

使用django的ImageField和from制作上传图片页面

需求描述: 做一个简单的注册页面,使得用户在注册页上传头像. 解决办法: 以前用java写这个的时候,在action上面需要用IO接受文件,然后生成一个文件名,再将文件相对路径保存到user表的img字段中. 而在django的model层上,有一个叫做ImageField的字段(还有FileField,两者几乎一样),看了文档中对于这个字段的描述,大致意思就是自动将文件保存在media的文件夹里面,然后产生的文件路径保存到一个var char的字段中.如果一个model有ImageField字

django上传图片

django修改头像的功能... 1.在表单中加入enctype="multipart/form-data: 关于表单中enctype的介绍:http://www.w3school.com.cn/tags/att_form_enctype.asp 处理表单的视图会在request中接受到上传文件的数据.FILES是个字典,它包含每个FileField的键 (或者ImageField,FileField的子类).这样的话就可以用request.FILES['File']来存放表单中的这些数据了.

django 上传图片、使用PIL制作缩略图并保存到sea的storage

上传图片解析: SAE的设置指引如下: 处理用户上传文件 在setttings.py中添加以下配置. # 修改上传时文件在内存中可以存放的最大size为10m FILE_UPLOAD_MAX_MEMORY_SIZE = 10485760 # sae的本地文件系统是只读的,修改django的file storage backend为Storage DEFAULT_FILE_STORAGE = 'sae.ext.django.storage.backend.Storage' # 使用media这个b

Django中ImageField的使用

http://blog.csdn.net/u013690521/article/details/38777213 from django.db import models from django.contrib import admin # Create your models here. class AdminUser(models.Model): loginname = models.CharField(max_length=64, unique=True, db_index=True) f

django上传图片简单验证以及自动修改图片名称

django实现文件(图片)上传之后自动修改名称以及页面上传图片时的各种提醒: 1.先在你项目中添加一个文件夹如:system 在文件夹下添加__init__.py 和storage.py文件,并在storage.py中添加如下代码: # -*- coding:utf-8 -*- from django.core.files.storage import FileSystemStorage from django.http import HttpResponse class ImageStora

django 上传图片不能在视图中显示的解决方法

media路径设置: MEDIA_ROOT = os.path.join(BASE_DIR, 'media') MEDIA_URL =  '/media/' 网页中图片无法显示,显示404错误: [28/Oct/2014 11:03:15] "GET /media/photos/44.thumb.JPG HTTP/1.1" 404 2528 解决方法: 根据DJANGO1.6文档 -6.19.2 static(): 设置项目URL文件: from django.conf import 

python django 上传图片

安装PIL模块,如果你的电脑是windows的话,64位的下载地址为http://www.lfd.uci.edu/~gohlke/pythonlibs/ 安装命令:pip install *.whl 如果你的电脑是linux的话直接下载http://www.pythonware.com/products/pil/ 安装即可 前台代码 <input type="file" name="image"> 4.后台代码 reqfile= request.FILE

实战Django:Rango Part4

在这个部分,我们将要开始学习如何设计用户系统,Django提供了一个叫"django.contrib.auth"的应用,我们可以用它来做出用户注册.登录.注销等一系列功能. 17.用户模型 在Django自带的用户系统中,用户模型里已经包含了如下数据: 用户名 密码 电子邮箱 姓名 我们想在用户模型中增加一些额外的字段,如: 链接字段:允许用户展示他们自己的个人网站 图片字段:让用户可以给自己设置一个头像 我们只要更新模型就可以实现上述的需求,编辑rango/models.py文件,先

django模型和字段

一个模型(model)就是一个单独的.确定的数据的信息源,包含了数据的字段和操作方法.通常,每个模型映射为一张数据库中的表. 基本的原则如下: 每个模型在Django中的存在形式为一个Python类 每个模型都是django.db.models.Model的子类 模型的每个字段(属性)代表数据表的某一列 Django将自动为你生成数据库访问API 简单示例: 下面的模型定义了一个“人”,它具有first_name和last_name字段: from django.db import models