一、靜態文件的加載
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() # 數據庫存儲的是路徑
。