django實現文件上傳

在django中實現文件上傳有三種方法可以實現:

  • 自己手動寫
  • 使用Form組件
  • 使用ModelForm組件
    其中使用ModelForm組件實現是最簡單的。

1、自己手寫

先寫一個上傳的頁面 upload_file.html
enctype="multipart/form-data 一定要加這個,不然只會上傳文件名,不會上傳文件內容。

{% extends 'layout.html' %}{% block content %}<div class="container"><form method="post" enctype="multipart/form-data">{% csrf_token %}<input type="text" name="username"><input type="file" name="avatar"><input type="submit" value="提交"></form></div>{% endblock %}

在寫一個視圖函數:
在這個視圖函數中如果是get 請求就展示上傳的頁面,如果是post 請求,就將獲取到的文件對象在項目跟目錄創建一個相同的文件名保存起來。

from django.shortcuts import render, HttpResponsedef upload_list(request):if request.method == 'GET':return render(request,'upload_file.html')print(request.POST)   # 請求體中的數據print(request.FILES)  # 請求發過來的文件 {}file_object = request.FILES.get("avatar")f = open(file_object.name,mode='wb')for chunk in file_object.chunks():f.write(chunk)f.close()return HttpResponse('上傳成功')

簡單的頁面效果:
在這里插入圖片描述

2、使用Form組件

提交頁面時: 用戶輸入數據 + 文件(輸入不能為空,報錯)

  • Form生成HTML標簽 :type=file
  • 表單的驗證
  • form.cleaned_data 獲取數據 + 文件對象

將上傳的圖片保存到static目錄,并且在數據庫保存文件存儲的路徑
models.py 中創建一個數據庫

class Boss(models.Model):"""保存圖片"""name = models.CharField(verbose_name="姓名",max_length=32)age = models.IntegerField(verbose_name="年齡")img = models.CharField(verbose_name="圖片",max_length=128)

視圖函數

from django.shortcuts import render, HttpResponse
from django import forms
import os
from app01 import modelsclass UpForm(forms.Form):name = forms.CharField(label='姓名')age = forms.IntegerField(label='年齡')img = forms.FileField(label='頭像')def upload_form(request):if request.method == 'GET':form = UpForm()return render(request,'upload_form.html',{'form':form})form = UpForm(data=request.POST,files=request.FILES)if form.is_valid():# 1、讀取圖片內容,寫入文件夾中并獲取文件的路徑image_object = form.cleaned_data.get('img')# 創建文件路徑db_file_path = os.path.join('static','img',image_object.name)file_path = os.path.join('app01',db_file_path)f = open(file_path,mode='wb')for chunk in image_object.chunks():f.write(chunk)f.close()# 2、 將圖片文件路徑寫入到數據庫models.Boss.objects.create(name=form.cleaned_data['name'],age = form.cleaned_data['age'],img = db_file_path,)return HttpResponse('上傳成功')return render(request,'upload_form.html',{'form':form})

upload_form.html 文件內容:

{% extends 'layout.html' %}{% block content %}<div class="container"><div class="panel panel-default"><div class="panel-heading">圖片上傳</div><div class="panel-body"><form  method="post"  enctype="multipart/form-data"  novalidate>{% csrf_token %}{% for field in form %}<div class="form-group"><label >{{ field.label }}</label>{{ field }}<span style="color:red">{{ field.errors.0 }}</span></div>{% endfor %}<button type="submit" class="btn btn-primary">提交</button></form></div></div></div>
{% endblock %}

頁面效果:
在這里插入圖片描述

3、使用ModelForm組件

使用ModelForm的前提條件要設置好media 目錄

啟用media 目錄

在django的開發中有兩個特殊的文件夾:

  • static , 存放靜態文件的路徑,包括: css、js 、項目圖片。
  • media , 用戶上傳的數據目錄。
    1、在urls.py中的配置
from django.urls import path,re_path
from django.views.static import serve
from django.conf import settingsurlpatterns = [re_path(r'^media/(?P<path>.*)$', serve, {'document_root':settings.MEDIA_ROOT},name='media'),]

2、在settings.py中配置:

import osMEDIA_ROOT = os.path.join(BASE_DIR,"media")
MEDIA_URL = "/media/"

models.py 重新創建一個表來存儲文件路徑

class City(models.Model):"""城市"""name = models.CharField(verbose_name="名稱",max_length=32)count = models.IntegerField(verbose_name="人口")# 本質上數據庫也是charField ,自動保存數據,upload_to 表示會保存到media目錄下的cityimg = models.FileField(verbose_name='Logo',max_length=128,upload_to='city/')

視圖函數:
通過 form.save() django 自動將文件存儲到media目錄下的city目錄,并且把文件路徑保存到數據庫

from django.shortcuts import render, HttpResponse
from app01 import models
from app01.utils.bootstrap import BootStrapModelFormclass UploadModelForm(BootStrapModelForm):bootstrap_exclude_name = ['img']class Meta:model = models.Cityfields = "__all__"def upload_modelform(request):if request.method == 'GET':form = UploadModelForm()return render(request,'upload_form.html',{'form':form})form = UploadModelForm(data=request.POST,files=request.FILES)if form.is_valid():form.save()return HttpResponse('上傳成功')return render(request, 'upload_form.html', {'form': form})

upload_form.html

{% extends 'layout.html' %}{% block content %}<div class="container"><div class="panel panel-default"><div class="panel-heading">圖片上傳</div><div class="panel-body"><form  method="post"  enctype="multipart/form-data"  novalidate>{% csrf_token %}{% for field in form %}<div class="form-group"><label >{{ field.label }}</label>{{ field }}<span style="color:red">{{ field.errors.0 }}</span></div>{% endfor %}<button type="submit" class="btn btn-primary">提交</button></form></div></div></div>
{% endblock %}

效果:
在這里插入圖片描述
數據庫存儲的:
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/39784.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/39784.shtml
英文地址,請注明出處:http://en.pswp.cn/news/39784.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HTTPS 的加密流程

目錄 一、HTTPS是什么&#xff1f; 二、為什么要加密 三、"加密" 是什么 四、HTTPS 的工作過程 1.對稱加密 2.非對稱加密 3.中間人攻擊 4.證書 總結 一、HTTPS是什么&#xff1f; HTTPS (Hyper Text Transfer Protocol Secure) 是基于 HTTP 協議之上的安全協議&…

四、Controller 配置總結、RestFul 風格

文章目錄 一、Controller 配置總結二、RestFul 風格2.1 使用 RequestMapping 的 method 屬性指定請求類型 三、擴展&#xff1a;小黃鴨調試法 一、Controller 配置總結 實現 Controller 控制器的方式 實現 Controller 接口&#xff0c;重寫 handleRequest 方法實現 控制器實現 …

Markdown編輯器 Mac版Typora功能介紹

Typora mac是一款跨平臺的Markdown編輯器&#xff0c;支持Windows、MacOS和Linux操作系統。它具有實時預覽功能&#xff0c;能夠自動將Markdown文本轉換為漂亮的排版效果&#xff0c;讓用戶專注于寫作內容而不必關心格式調整。 Typora Mac版除了支持常見的Markdown語法外&#…

騰訊云輕量服務器測評:2核 2G 4M

騰訊云輕量2核2G4M服務器&#xff0c;4M帶寬下載速度可達512KB/秒&#xff0c;系統盤為50GB SSD盤&#xff0c;300GB月流量&#xff0c;地域節點可選上海、廣州和北京&#xff0c;騰訊云百科分享騰訊云2核2G4M輕量應用服務器配置性能表&#xff1a; 目錄 騰訊云輕量2核2G4M服…

Linux下使用Ffmpeg循環推流

#前臺運行 ffmpeg -stream_loop -1 -re -i "/usr/local/mp4/test.mp4" -vcodec h264 -acodec aac -f rtsp -rtsp_transport tcp rtsp://10.55.134.12/live/test#后臺運行 nohup ffmpeg -stream_loop -1 -re -i "/usr/local/mp4/test.mp4" -vcodec h264 -ac…

爬蟲逆向實戰(十五)--阿某某營登錄

一、數據接口分析 主頁地址&#xff1a;阿某某營 1、抓包 通過抓包可以發現登錄接口是Users/Login 2、判斷是否有加密參數 請求參數是否加密&#xff1f; 通過查看“載荷”模塊可以發現有一個s加密參數 請求頭是否加密&#xff1f; 無響應是否加密&#xff1f; 無cookie是…

【LangChain】P1 LangChain 應用程序的核心構建模塊 LLMChain 以及其三大部分

LangChain 的核心構建模塊 LLMChain LangChain 應用程序的核心構建模塊語言模型 - LLMs提示模板 - Prompt templates輸出解析器 - Output Parsers LLMChain 組合 LangChain 應用程序的核心構建模塊 LangChain 應用程序的核心構建模塊 LLMChain 由三部分組成&#xff1a; 語言…

電腦鍵盤打不了字按哪個鍵恢復?最新分享!

“有沒有朋友知道電腦鍵盤為什么會莫名其妙就打不了字&#xff1f;明明用得好好的&#xff0c;突然就打不了字了&#xff0c;真的讓人很迷惑&#xff01;有什么方法可以解決嗎&#xff1f;” 電腦鍵盤為我們的辦公提供了很大的方便&#xff0c;我們可以利用鍵盤輸入我們需要的文…

安防監控視頻云存儲平臺EasyCVRH.265轉碼功能更新:新增分辨率配置

安防視頻集中存儲EasyCVR視頻監控綜合管理平臺可以根據不同的場景需求&#xff0c;讓平臺在內網、專網、VPN、廣域網、互聯網等各種環境下進行音視頻的采集、接入與多端分發。在視頻能力上&#xff0c;視頻云存儲平臺EasyCVR可實現視頻實時直播、云端錄像、視頻云存儲、視頻存儲…

Python文件操作與輸入輸出:從基礎到高級應用

文章目錄 &#x1f340;引言&#x1f340;文件操作基礎&#x1f340;上下文管理器與文件自動關閉&#x1f340;文件的迭代與逐行讀取&#x1f340;文件的其他常見操作&#x1f340;輸入輸出基礎&#x1f340; 文件輸入輸出&#x1f340;格式化輸出&#x1f340;高級文件操作&am…

【BASH】回顧與知識點梳理(二十七)

【BASH】回顧與知識點梳理 二十七 二十七. 磁盤配額(Quota)27.1 磁盤配額 (Quota) 的應用與實作什么是 QuotaQuota 的一般用途Quota 的使用限制Quota 的規范設定項目 27.2 一個 XFS 文件系統的 Quota 實作范例實作 Quota 流程&#xff1a;設定賬號實作 Quota 流程-1&#xff1a…

jenkins gitlab 安裝

目錄 一 準備安裝環境 二 安裝gitlab軟件 三 配置gitlab 四 重新加載配置啟動gitlab 五 修改密碼 五 創建用戶組 一 準備安裝環境 sudo yum update sudo yum install -y curl policycoreutils-python openssh-server安裝 Postfix 郵件服務器&#xff0c;以便 Git…

qt事件系統源碼-----定時器

qt定時器的使用一般有以下幾種方式&#xff1a; 1、直接使用QTimer對象&#xff0c;綁定定時器的timeout信號&#xff1b; 2、使用QTimer的靜態方法singleshot方法&#xff0c;產生一個一次性的定時事件 3、在QObject子類中&#xff0c;調用startTimer方法&#xff0c;產生定…

矢量繪圖UI設計軟件Sketch mac中文版軟件說明

Sketch mac是一款適用于 UI/UX 設計、網頁設計、圖標制作等領域的矢量繪圖軟件。 Sketch mac軟件特點 1. 簡單易用的界面設計&#xff1a;Sketch 的用戶界面簡潔明了&#xff0c;使得用戶可以輕松上手操作&#xff0c;不需要復雜的學習過程。 2. 強大的矢量繪圖功能&#xff1a…

flinksql實時統計程序背壓延遲優化

問題&#xff1a; flinkcdcflinksql做實時讀取sls日志和實時統計業務指標&#xff0c;今天發現程序背壓了&#xff0c;業務延遲了6個小時。解決辦法&#xff1a; 1、資源優化 作業并發大時&#xff1a;在作業的高級配置的資源配置中&#xff0c;增加JobManager的資源&#xf…

香港服務器三網直連內地線路什么意思?好用嗎?

?  三網直連內地是指香港服務器可以直接連接中國內地的電信、聯通和移動三大運營商網絡&#xff0c;避免了中間網絡干線的支持。這樣可以實現直接、快速、穩定的網絡訪問&#xff0c;提高用戶對網絡訪問的效率&#xff0c;減少網絡訪問問題和擁堵的現象。 香港服務器直連內地…

XSS 跨站腳本攻擊

XSS(DOM) XSS 又稱CSS(Cross Site Scripting)或跨站腳本攻擊&#xff0c;攻擊者在網頁中插入由JavaScript編寫的惡意代碼&#xff0c;當用戶瀏覽被嵌入惡意代碼的網頁時&#xff0c;惡意代碼將會在用戶的瀏覽器上執行。 XSS攻擊可分為三種&#xff1a;分別為反射型(Reflected…

線程|線程的使用、四種實現方式

1.線程的實現方式 1.用戶級線程 開銷小&#xff0c;用戶空間就可以創建多個。缺點是&#xff1a;內核無法感知用戶級多個線程的存在&#xff0c;把其當作只有一個線程&#xff0c;所以只會提供一個處理器。 2.內核級線程 相對于用戶級開銷稍微大一點&#xff0c;可以利用多…

Unity C# 之 Azure 微軟SSML語音合成TTS流式獲取音頻數據以及表情嘴型 Animation 的簡單整理

Unity C# 之 Azure 微軟SSML語音合成TTS流式獲取音頻數據以及表情嘴型 Animation 的簡單整理 目錄 Unity C# 之 Azure 微軟SSML語音合成TTS流式獲取音頻數據以及表情嘴型 Animation 的簡單整理 一、簡單介紹 二、實現原理 三、注意事項 四、實現步驟 五、關鍵代碼 一、簡…

01- vdom 和模板編譯源碼

組件渲染的過程 template --> ast --> render --> vDom --> 真實的Dom --> 頁面 Runtime-Compiler和Runtime-Only的區別 - 簡書 編譯步驟 模板編譯是Vue中比較核心的一部分。關于 Vue 編譯原理這塊的整體邏輯主要分三個部分&#xff0c;也可以說是分三步&am…