在Django中上傳圖片包括兩種方式
?????? 在管理頁面admin中上傳圖片
????? 自定義form表單中上傳圖片,上傳圖片后寝蹈,將圖片存儲(chǔ)在服務(wù)器上,然后將圖片的路徑存儲(chǔ)在表中。
使用模型處理上傳文件:將屬性定義成models.ImageField類型
如果屬性類型為imageField需要安裝Pilow
pip install Pillow
(1)? 打開 應(yīng)用/models.py文件,定義模型類PicTest锯仪。
class PicTest(models.Model):
??? pic = models.ImageField(upload_to='booktest/')? #upload_to指定圖片保存的路徑
(2)? 生成遷移,執(zhí)行遷移
(3)? 在static目錄下創(chuàng)建media目錄趾盐,再創(chuàng)建應(yīng)用名稱的目錄庶喜,此例為booktest。
(4)? 打開 項(xiàng)目/settings.py文件救鲤,設(shè)置圖片保存路徑久窟。
因?yàn)閳D片也屬于靜態(tài)文件,所以保存到static目錄下蜒简。
MEDIA_ROOT=os.path.join(BASE_DIR,"static/media")
???????????? 在管理頁面admin中上傳圖片
(1)? 打開? 應(yīng)用/admin.py文件瘸羡,注冊(cè)PicTest。
from django.contrib import admin
from booktest.models import *
admin.site.register(PicTest)
(2) 注冊(cè)管理員賬戶
python manage.py createsuperuser
(3)? 運(yùn)行服務(wù)器搓茬,輸入如下網(wǎng)址犹赖。
http://127.0.0.1:8000/admin/
(4) 路徑要選擇當(dāng)前項(xiàng)目static文件夾下圖片
(5)回到數(shù)據(jù)庫命令行队他,查詢表pictest中的數(shù)據(jù)如下圖:
(6)圖片被保存到目錄static/media/booktest/下,如下圖:
???????????????? 自定義form表單中上傳圖片
(1)? 打開? 項(xiàng)目/views.py文件峻村,創(chuàng)建視圖pic_upload麸折。
def pic_upload(request):
??? return render(request,'booktest/pic_upload.html')
(2)? 打開?? 項(xiàng)目/urls.py文件,配置url粘昨。
url(r'^pic_upload/$', views.pic_upload),
(3)? 在templates/booktest/目錄下創(chuàng)建模板pic_upload.html垢啼。
在模板中定義上傳表單,要求如下:
??? ?? form的屬性enctype="multipart/form-data"
???? ? form的method為post
?????? input的類型為file
<form method="post" action="/pic_handle/" enctype="multipart/form-data" />
??????? {%csrf_token%}
??????? <input type="file" name="pic"/>
?????? <input type="submit" value="上傳" />
</form>
(4)打開? 項(xiàng)目/views.py文件张肾,創(chuàng)建視圖pic_handle芭析,用于接收表單保存圖片。
request對(duì)象的FILES屬性用于接收請(qǐng)求的文件吞瞪,包括圖片馁启。
from django.conf import settings
from django.http import HttpResponse
def pic_handle(request):
??? f1 = request.FILES.get('pic')? # 從前端獲取上傳的圖片? ?
??? fname = '{}/booktest/{}'.format(settings.MEDIA_ROOT,f1.name)’ # 圖片的完整路徑
??? with open(fname,'wb') as pic:# 文件操作
?????????? for c in f1.chunks():# 因?yàn)閳D片存儲(chǔ)的方式是二進(jìn)制流,用f1.chunks()獲取圖片的字節(jié)
? ? ? ? ? ???? pic.write(c)
??? return HttpResponse('OK')
(5)? 打開booktest/urls.py文件芍秆,配置url惯疙。
? ? url(r'^pic_handle/$', views.pic_handle),
(6)? 運(yùn)行服務(wù)器,在瀏覽器中輸入如下網(wǎng)址:
http://127.0.0.1:8000/pic_upload/
這里只是完成圖片上傳的代碼妖啥,如果需要保存數(shù)據(jù)到表中需要?jiǎng)?chuàng)建PicTest對(duì)象完成保存霉颠。
????????????????????? 顯示圖片
(1)打開? 應(yīng)用/views.py文件,創(chuàng)建視圖pic_show荆虱。
from booktest.models import PicTest
def pic_show(request):
??? pic = PicTest.objects.get(pk=1)
? ? context={'pic':pic}
??? return render(request,'booktest/pic_show.html',context)
(2)? 打開? 應(yīng)用/urls.py文件蒿偎,配置url。
? ? url(r'^pic_show/$', views.pic_show),
(3)? 在templates/booktest/目錄下創(chuàng)建模板pic_show.html克伊。
? ? <img src="/static/media/{{pic.pic}}"/>
顯(4)運(yùn)行服務(wù)器酥郭,在瀏覽器中輸入如下網(wǎng)址:
http://127.0.0.1:8000/pic_show/