django上传图片,ImageField
来源:互联网 发布:微博seo 编辑:程序博客网 时间:2024/05/21 21:37
首先建立两个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 已经可以使用了 :-)
- django上传图片,ImageField
- django ImageField,FileField,上传文件,命名问题
- Django如何在模板中显示通过ImageField上传的图片
- django ImageField使用
- 【Django】使用ImageField
- Django1.9 加载通过ImageField上传的图片
- 【ExtJS】图片编辑器imagefield
- 四 Django 1.5.4 ImageField
- Django中ImageField的使用
- django上传图片
- django上传图片
- 【Django】 上传图片
- Django上传图片例子
- Django图片上传。
- django上传图片
- c++ django上传图片
- Django上传图片到七牛云
- django动态改变ImageField,FileField的upload_to
- MySQL 通配符学习小结
- 老罗的傻逼言论
- xorg初始化过程,没有配置文件,用默认值
- HDOJ 题目5093 Battle ships(二分图)
- hdu5176---The Experience of Love
- django上传图片,ImageField
- sqlserver函数大全
- ————Xer
- 【HDU】5175 Misaki's Kiss again(反异或|搜索匹配因子做法)
- 常问自己的问题和日常习惯
- 隐藏标题栏
- ORACLE 11G DataGuard的一些高级管理案例研究
- Java按位操作符、移位操作符
- 添加一个对象到集合中时,集合里面存放的是对象的引用还是对象本身?