搜尋
首頁後端開發Python教學Django計畫實戰之用戶頭像上傳與訪問

Django計畫實戰之用戶頭像上傳與訪問

Apr 21, 2018 pm 02:49 PM
django頭像使用者

這篇文章主要介紹了Django專案實戰之用戶頭像上傳與訪問的範例,現在分享給大家,也給大家做個參考。一起來看看吧

1 將檔案儲存到伺服器本地

#upload.html

##

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
  {% csrf_token %}
  <p>用户名:<input type="text" name="username"></p>
  <p>头像<input type="file" name="avatar"></p>
  <input type="submit" value="提交">
</form>
</body>
</html>

urls.py


from django.conf.urls import url
from app01 import views
urlpatterns = [
  url(r&#39;^upload&#39;,views.upload)
]

#views.py


##
from django.shortcuts import render,HttpResponse 
def upload(request):
  if request.method == &#39;POST&#39;:
    name = request.POST.get(&#39;username&#39;)
    avatar = request.FILES.get(&#39;avatar&#39;)
    with open(avatar.name,&#39;wb&#39;) as f:
      for line in avatar:
        f.write(line)
    return HttpResponse(&#39;ok&#39;)
  return render(request,&#39;upload.html&#39;)

總結


這樣,我們就做好了一個基本的檔案上傳小範例,這裡需要注意的有幾點:

 1.form表單裡需要加上csrf_token驗證

 2.檔案的input框的type的值為file
 3.在檢視函數中取得檔案要用request.FILES.get()方法
 4.透過obj.name可以取得檔案的名稱


2 將檔案上傳到資料庫


#models.py


##

from django.db import models
 class User(models.Model):
  username = models.CharField(max_length=16)
  avatar = models.FileField(upload_to=&#39;avatar&#39;)

views.py


def upload(request):
  if request.method == &#39;POST&#39;:
    name = request.POST.get(&#39;username&#39;)
    avatar = request.FILES.get(&#39;avatar&#39;)
    models.User.objects.create(username=name,avatar=avatar)
    return HttpResponse(&#39;ok&#39;) 
  return render(request,&#39;upload.html&#39;)

#總結

##上面已經實現了將檔案上傳到資料庫的功能,需要注意的有幾點: 1.所謂的上傳到資料庫,不是講圖片本身或二進位碼放在資料庫,實際上也是將檔案上傳到伺服器本地,資料庫只是存了一個檔案的路徑,這樣使用者要呼叫檔案的時候就可以透過路徑去伺服器指定的位置找了
 2.建立ORM的時候,avatar欄位要有一個upload_to=''的屬性,指定上傳後的檔案放在哪裡

 3.往資料庫新增的時候,檔案欄位屬性賦值跟普通欄位在形式上是一樣的,如:models.User.objects.create(username=name,avatar=avatar)

 4.如果有兩個使用者上傳的檔案名稱重複,系統會自動將檔案改名,效果如下:




附加

功能我們是實作了,看起來我們在呼叫檔案的時候,只需要透過資料庫檔案路徑已經儲存的檔案本身就可以存取圖片,讓它出現在網頁上,其實並不是這樣,

我們需要配置一些東西,django才可以找的到,不然的話就會過不了urls驗證,而我們之所以可以直接訪問static裡的靜態文件,是因為django已經幫我們配置好了。



設定步驟如下:

#1、在網站的setting.py裡設定


MEDIA_ROOT=os.path.join(BASE_DIR,"blog","media") #blog是项目名,media是约定成俗的文件夹名

MEDIA_URL="/media/"   # 跟STATIC_URL类似,指定用户可以通过这个路径找到文件

2、在urls.py裡設定

#

from django.views.static import serve
from upload import settings        #upload是站点名
url(r&#39;^media/(?P<path>.*)$&#39;, serve, {&#39;document_root&#39;: settings.MEDIA_ROOT}),

##設定完後,就可以透過http://127.0.0.1:8001/media/milk.png訪問圖片了 

3 用AJAX提交檔案


#upload. html

<!DOCTYPE html>

<html lang="en">
<head>
  <meta charset="UTF-8">
</head>
<body>
<form>
  {% csrf_token %}
  <p>用户名:<input id="name-input" type="text"></p>

  <p>头像<input id="avatar-input" type="file"></p>
  <input id="submit-btn" type="button" value="提交">
</form>
<script src="/static/js/jquery-3.2.1.min.js"></script>
<script>
  $(&#39;#submit-btn&#39;).on(&#39;click&#39;,function () {
    formdata = new FormData();
    formdata.append(&#39;username&#39;,$(&#39;#name-input&#39;).val());
    formdata.append("avatar",$("#avatar")[0].files[0]);
    formdata.append("csrfmiddlewaretoken",$("[name=&#39;csrfmiddlewaretoken&#39;]").val()); 
 $.ajax({
 processData:false,contentType:false,url:&#39;/upload&#39;, type:&#39;post&#39;, data:formdata,success:function (arg)
 { 
if (arg.state == 1){ alert(&#39;成功!&#39;) }
else { alert(&#39;失败!&#39;) } } }) });
 </script>
 </body> 
</html>


views.py

from django.shortcuts import render,HttpResponse
from django.http import JsonResponse
from app01 import models
def upload(request):
  if request.method == &#39;POST&#39;:
    name = request.POST.get(&#39;username&#39;)
    avatar = request.FILES.get(&#39;avatar&#39;)
    try:
      models.User.objects.create(username=name,avatar=avatar)
      data = {&#39;state&#39;:1}
    except:
      data = {&#39;state&#39;:0}
    return JsonResponse(data)
  return render(request,&#39;upload.html&#39;)


##總結

1.Ajax上傳的時候,按鈕的tpye一定不要用submit

2.Ajax上傳的時候data參數的值不再是一個普通'字典'類型的值,而是一個FormData物件


建立物件formdata = new FormData(); 


    往裡面新增值formdata.append('username',$( '#name-input').val());
  1. 3.Ajax在做post提交的時候要加上csrf驗證
  2. formdata.append("csrfmiddlewaretoken",$("[name='csrfmiddlewaretoken']").val());

    4.最後,Ajax上傳檔案的時候要有兩個參數設定
  1. processData:false

    #contentType:false
  1. # 4上傳圖片檔案的時候有預覽功能

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
</head>
<body>
<form>
  <!----用一个label标签将上传文件输入框跟图片绑定一起,
     点击图片的时候就相当于点击了上传文件的按钮---->
  <label><img  src="/static/imghwm/default1.png"  data-src="/static/img/default.png"  class="lazy"  id="avatar-img"     style="max-width:90%" height="80px" alt="Django計畫實戰之用戶頭像上傳與訪問" >
    <p>头像<input id="avatar-input" hidden type="file"></p>

  </label>
  <input id="submit-btn" type="button" value="提交">
</form>
<script src="/static/js/jquery-3.2.1.min.js"></script>
<script>
  // 上传文件按钮(label里的图片)点击事件
  $(&#39;#avatar-input&#39;).on(&#39;change&#39;,function () {
    // 获取用户最后一次选择的图片
    var choose_file=$(this)[0].files[0];
    // 创建一个新的FileReader对象,用来读取文件信息
    var reader=new FileReader();
    // 读取用户上传的图片的路径
    reader.readAsDataURL(choose_file);
    // 读取完毕之后,将图片的src属性修改成用户上传的图片的本地路径
    reader.onload=function () {
       $("#avatar-img").attr("src",reader.result)
    }
  });
</script>

#5 大總結

對於檔案上傳,不管是直接form提交也好,Ajax提交也好,根本問題是要告訴瀏覽器你要上傳的是一個檔案而不是普通的字串

而怎麼樣告訴瀏覽器呢,就是透過請求體重的ContentType參數,我們上傳普通的字串的時候不用指定,因為它有預設值,

而如果要傳文件的話,就要另外指定了。總結以下幾點
 1.form表單上傳的話是透過enctype="multipart/form-data" 來指定ContentType

 2.ajax上傳的話是透過  processData:false 和contentType:false來指定ContentType

3.form上傳的時候,檔案資料是透過標籤來''包裹''數據,
 4.ajax上傳的時候,是透過一個FormData 實例物件來新增數據,傳遞的時候傳遞這個物件就行了

 5.資料傳遞過去之後,是封裝在request.FILES裡,而不是request.POST裡



#相關推薦:

#

Django如何載入css和js檔案以及靜態圖片

django控制項及傳參使用詳解

#

以上是Django計畫實戰之用戶頭像上傳與訪問的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Python vs. C:了解關鍵差異Python vs. C:了解關鍵差異Apr 21, 2025 am 12:18 AM

Python和C 各有優勢,選擇應基於項目需求。 1)Python適合快速開發和數據處理,因其簡潔語法和動態類型。 2)C 適用於高性能和系統編程,因其靜態類型和手動內存管理。

Python vs.C:您的項目選擇哪種語言?Python vs.C:您的項目選擇哪種語言?Apr 21, 2025 am 12:17 AM

選擇Python還是C 取決於項目需求:1)如果需要快速開發、數據處理和原型設計,選擇Python;2)如果需要高性能、低延遲和接近硬件的控制,選擇C 。

達到python目標:每天2小時的力量達到python目標:每天2小時的力量Apr 20, 2025 am 12:21 AM

通過每天投入2小時的Python學習,可以有效提升編程技能。 1.學習新知識:閱讀文檔或觀看教程。 2.實踐:編寫代碼和完成練習。 3.複習:鞏固所學內容。 4.項目實踐:應用所學於實際項目中。這樣的結構化學習計劃能幫助你係統掌握Python並實現職業目標。

最大化2小時:有效的Python學習策略最大化2小時:有效的Python學習策略Apr 20, 2025 am 12:20 AM

在兩小時內高效學習Python的方法包括:1.回顧基礎知識,確保熟悉Python的安裝和基本語法;2.理解Python的核心概念,如變量、列表、函數等;3.通過使用示例掌握基本和高級用法;4.學習常見錯誤與調試技巧;5.應用性能優化與最佳實踐,如使用列表推導式和遵循PEP8風格指南。

在Python和C之間進行選擇:適合您的語言在Python和C之間進行選擇:適合您的語言Apr 20, 2025 am 12:20 AM

Python適合初學者和數據科學,C 適用於系統編程和遊戲開發。 1.Python簡潔易用,適用於數據科學和Web開發。 2.C 提供高性能和控制力,適用於遊戲開發和系統編程。選擇應基於項目需求和個人興趣。

Python與C:編程語言的比較分析Python與C:編程語言的比較分析Apr 20, 2025 am 12:14 AM

Python更適合數據科學和快速開發,C 更適合高性能和系統編程。 1.Python語法簡潔,易於學習,適用於數據處理和科學計算。 2.C 語法複雜,但性能優越,常用於遊戲開發和系統編程。

每天2小時:Python學習的潛力每天2小時:Python學習的潛力Apr 20, 2025 am 12:14 AM

每天投入兩小時學習Python是可行的。 1.學習新知識:用一小時學習新概念,如列表和字典。 2.實踐和練習:用一小時進行編程練習,如編寫小程序。通過合理規劃和堅持不懈,你可以在短時間內掌握Python的核心概念。

Python與C:學習曲線和易用性Python與C:學習曲線和易用性Apr 19, 2025 am 12:20 AM

Python更易學且易用,C 則更強大但複雜。 1.Python語法簡潔,適合初學者,動態類型和自動內存管理使其易用,但可能導致運行時錯誤。 2.C 提供低級控制和高級特性,適合高性能應用,但學習門檻高,需手動管理內存和類型安全。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版