有关上传文件的静态文件是用media来处理的 在settings.py里面增加:
MEDIA_URL = '/upload/' MEDIA_ROOT = os.path.join(BASE_DIR, 'upload')对于这个配置什么意思,可以参照我另一篇博文 :静态文件的配置说明
首先说明一下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可以让我们轻松的获得相对路径和浏览器可以访问的绝对路径, 下面会讲到)
比如有一个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/
我们以一个简单的例子来说明 新建一个项目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设置的路径中,
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)