配置
有关上传文件的静态文件是用media来处理的
在settings.py里面增加:
MEDIA_URL = '/upload/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'upload')
对于这个配置什么意思,可以参照我另一篇博文 :静态文件的配置说明
使用django的FileField或ImageField字段
首先说明一下FileField的基本参数
FileField(upload_to = None, max_length = 100)
在upload_to设置上传的文件的安放路径,注意,这里写的是相对路径,
比如upload_to = ‘user/’
那么实际存储的路径为 os.path.join(MEDIA_ROOT, ‘user’),
比如MEDIA_ROOT 为 home/mysite/upload/
那么存储的路径就是 home/mysite/upload/user/
另外,使用这个字段时,上传的文件并没有存入数据库,存入数据库的只是上传的文件的路径(当然, 强大的django可以让我们轻松的获得相对路径和浏览器可以访问的绝对路径, 下面会讲到)
1.在model里面使用字段
比如有一个user的model, 需要一个字段来表示用户头像
在models.py中:
from django.db import models
class User(models.Model):
user_name = models.CharField(max_length = 100)
image = models.ImageField(uoload_to = 'user/', max_length = 100)
如果嫌upload_to要直接指定一个固定的路径,不安全,那么可以写成动态路径,如下
class User(models.Model):
user_name = models.CharField(max_length = 100)
image = models.ImageField(uoload_to = 'user/%Y/%m/%d/', max_length = 100)
django会将%Y/%m/%d/替换称当前时间的年月日, 格式具体如下
比如, 我在2016.8.16上传了一个文件,那么,存储的路径就是:
MEDIA_ROOT/user/2016/08/16/
2.如何上传文件呢,
我们以一个简单的例子来说明
新建一个项目mysite以及应用user
首先,在user/templates/中建立
page.html
<form action = "#" enctype="multipart/form-data">
<input type="file" name = "cover_image" />
</form>
在views.py中:
from user.models import User
from django.shortcuts import render
def index(request):
if request.method == 'GET':
return render(request, 'page.html')
else :
//上传的文件保存在request.FILES中
file = request.FILES.get('cover_image')
user = User()
user.user_name, user.image = 'boyce', file
user.save()
在urls.py增加url与该视图函数对应即可,再次不重复了
当调用该视图函数时,就会将前端页面上传的文件存储到upload_to设置的路径中,
3.如何访问上传的路径
FileField字段有几个属性
FileField.url 显示上传文件的绝对路径
而FileField显示的是相对路径, 即使这upload_to设置的相对路径
比如
user.image 为 user/2016/8/13/photo.png
user.image.url 为 /upload/user/2016/8/13/photo.png
在浏览器上,使用绝对路径即可访问相应的上传文件(注意,这里的绝对路径, 不是本地的绝对路径, 而是浏览器可访问的绝对路径, 前缀一定是MEDIA_URL设置的值)
所以 /upload/user/2016/8/13/photo.png 对应的本地路径为/home/mysite/upload/user/2016/8/13/photo.png, (MEDIA_ROOT/user/2016/8/13/photo.png)