文件的上传

MEDIA_ROOT = os.path.join(BASE_DIR,'media')
from django.urls import path,re_path
from django.views.static import serve
from cnblog import settings
##media配置——配合settings中的MEDIA_ROOT的配置,就能够在浏览器的地址栏访问media文件夹及里面的文件了
re_path(r'media/(?P<path>.*)$',serve,{'document_root':settings.MEDIA_ROOT}),
固然,咱们这里实现的是文件上传的功能,须要将文件信息传给数据库保存,models.py
文件中的内容以下:
class UserInfo(models.Model):
nid = models.AutoField(primary_key=True)
##头像是一个FileField——注意这里必须是“相对路径”,不能是/avatars/这样的绝对路径
avatar = models.FileField(upload_to='avatars/',default='avatars/default.jpg')
当咱们将图片上传到服务器后,就会在咱们指定的目录看到上传的文件了:

文件的访问
文件的访问简介
http://127.0.0.1:8000/media/avatars/222.jpg
这样就能够显示这个图片了。
可是实际中,用户不可能去地址栏输入文件路径的,咱们作程序的目的就是尽最大限度的解放用户的操做————那么,是否有一种方法可以让用户仅仅点击一下就能查看到对应的文件呢?
答案固然是确定的!
django.template.context_processors.media
MEDIA_URL = '/media/'
接着咱们再新增一条测试路由:
##测试
path('aa/bb',views.aa),
视图也比较简单:
def aa(request):
return render(request,'aa.html')
而后模板文件中咱们作相应的功能:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="{{ MEDIA_URL }}avatars/222.jpg">查看media目录下的一张图片</a>
<p>MEDIA_URL: {{ MEDIA_URL }}</p>
</body>
</html>

咱们能够看到,点击连接的访问效果与在浏览器的地址栏输入文件路径的效果同样。
可能有人会问了,既然效果同样,那为什么不在模板中直接将a标签的href写死呢,何须用模板语言去渲染?!
固然,两者的效果当然同样,可是当咱们的项目作大的时候,文件目录的组织形式会愈来愈复杂,在settings中设置这样一个或者几个固定的、容易记忆的变量去存储复杂的文件路径,咱们在开发的时候就不会为这些“杂事”去动脑筋了,这样可以极大的提升咱们的编程效率。