一、静态文件的加载
1、使用步骤
①、在工程目录下创建static目录,创建css/js/images等目录,并添加相关资源
②、在settings.py中配置STATICFILES_DIRS
STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static"), ]
③、在模板中调用
绝对路径:
<link rel="stylesheet" href="/static/css/my.css">
相对路径:
{% load static %} 或 {% load staticfiles %} <img src="{% static 'images/bige.jpg' %}">
2、重要配置
①、STATIC_URL
静态资源的虚拟路径,会启动“静态资源探测器”
②、STATICFILES_DIRS
“静态资源探测器”会首先去查找STATICFILES_DIRS配置里设置的目录下的静态资源;然后会去查找每个app下的static子目录下的静态资源
③、STATIC_ROOT
可以通过"python manage.py collectstatic"命令将所有应用的静态资源收集到STATIC_ROOT指向的目录中
二、文件上传
本质上就是文件的读写操作,从一个文件读取,到另外一个文件写入。
上传文件所在的表单必须设置enctype="multipart/form-data"
<form method="post" action="" enctype="multipart/form-data"> {% csrf_token %} <input name="name" placeholder="用户名"> <br> <input type="file" name="photo"><br> <button>提交</button> </form>
1、Python代码实现
将文件内容打碎,一块一块写入:chunks()
def upload_file(request): if request.method == "GET": return render(request, 'upload.html') elif request.method == "POST": icon = request.FILES.get("icon") with open("G:\code\django_test\static\img\icon.jpg", 'wb') as save_file: # 此处使用绝对路径 for part in icon.chunks(): save_file.write(part) save_file.flush() # 写入一块就刷新一下,防止堵塞 return HttpResponse("文件上传成功")
2、ajax实现
def ajax_upload(request): if request.method == 'GET': return render(request,'upload_ajax.html') else: name = request.POST.get('ajaxname') # 接收文本框中的用户名 upload_obj = request.FILES.get('ajaxphoto') # 接收上传的文件,返回上传文件对象 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) upload_path = os.path.join(BASE_DIR, 'upload','ajax', upload_obj.name) # 拼接上传文件的路径 with open(upload_path, 'wb') as f: for chunk in upload_obj.chunks(): f.write(chunk) data = { 'status':'900', 'msg':'恭喜,'+ name + '上传成功', 'picpath':'ajax/'+ upload_obj.name, } return JsonResponse(data)
<!DOCTYPE html> {% load static %} <html lang="en"> <head> <meta charset="UTF-8"> <title>ajax上传文件</title> <script src="{% static 'jquery-3.1.1.js' %}"></script> </head> <body> {% csrf_token %} <p>上传人: <input type="text" name="name"></p> <p>照片: <input type="file" name="photo"></p> <input type="button" value="点我上传" id="btn"> <span id="msg"></span> <img src="" alt="" id="pic"> </body> </html> <script> $('#btn').click(function(){ var formData = new FormData(); //用来收集上传数据的对象 formData.append('ajaxname',$('input[name="name"]').val()); //添加用户名 formData.append('ajaxphoto',$('input[name="photo"]')[0].files[0]); //添加文件 //alert($('input[name="photo"]')[0].files[0]); formData.append('csrfmiddlewaretoken',$('input[name="csrfmiddlewaretoken"]').val()); //添加token $.ajax("{% url 'upload:ajax' %}",{ type:'POST', data: formData, contentType:false, processData:false, success:function (data) { if(data.status=='900'){ $('#msg').html(data.msg); var picpath = data.picpath; $('#pic').attr('src','/static/'+picpath); } } }) }) </script>
3、Django内置
①、配置
在settings.py文件中声明上传的路径。
MEDIA_ROOT= os.path.join(BASE_DIR, 'static')
②、图片上传
ImageField,专门用来处理图像上传,需要添加依赖pillow,pillow是专门处理图像的库
pip install pillow
ImageFiled中使用upload_to,需要指定上传后的目录
photo = models.ImageField(upload_to='upload') # 此处upload相当于MEDIE_ROOT
③、文件上传
FileField,与图片上传一致
④、文件存储
class Author(models.Model): name = models.CharField(max_length=20) photo = models.ImageField(upload_to='upload')
name = request.POST.get("name") photo = request.FILES.get('photo') author = Author() author.name = name author.photo = photo author.save() # 数据库存储的是路径
。