上传文件和提交textfield_0基础掌握Django框架(37)文件上传
為了更好的學習效果,請搭配視頻教程一起學習:
Django零基礎到項目實戰 - 網易云課堂?study.163.com文件上傳:
文件上傳是網站開發中非常常見的功能。這里詳細講述如何在Django中實現文件的上傳功能。
前端HTML代碼實現:
以上兩步的示例代碼如下:
<form action="" method="post" enctype="multipart/form-data"><input type="file" name="myfile"> </form>后端的代碼實現:
后端的主要工作是接收文件。然后存儲文件。接收文件的方式跟接收POST的方式是一樣的,只不過是通過FILES來實現。示例代碼如下:
def save_file(file):with open('somefile.txt','wb') as fp:for chunk in file.chunks():fp.write(chunk)def index(request):if request.method == 'GET':form = MyForm()return render(request,'index.html',{'form':form})else:myfile = request.FILES.get('myfile')save_file(myfile)return HttpResponse('success')以上代碼通過request.FILES接收到文件后,再寫入到指定的地方。這樣就可以完成一個文件的上傳功能了。
使用模型來處理上傳的文件:
在定義模型的時候,我們可以給存儲文件的字段指定為FileField,這個Field可以傳遞一個upload_to參數,用來指定上傳上來的文件保存到哪里。比如我們讓他保存到項目的files文件夾下,那么示例代碼如下:
# models.py class Article(models.Model):title = models.CharField(max_length=100)content = models.TextField()thumbnail = models.FileField(upload_to="files")# views.py def index(request):if request.method == 'GET':return render(request,'index.html')else:title = request.POST.get('title')content = request.POST.get('content')thumbnail = request.FILES.get('thumbnail')article = Article(title=title, content=content, thumbnail=thumbnail)article.save()return HttpResponse('success')調用完article.save()方法,就會把文件保存到files下面,并且會將這個文件的路徑存儲到數據庫中。
指定MEDIA_ROOT和MEDIA_URL:
以上我們是使用了upload_to來指定上傳的文件的目錄。我們也可以指定MEDIA_ROOT,就不需要在FielField中指定upload_to,他會自動的將文件上傳到MEDIA_ROOT的目錄下。
MEDIA_ROOT = os.path.join(BASE_DIR,'media') MEDIA_URL = '/media/'然后我們可以在urls.py中添加MEDIA_ROOT目錄下的訪問路徑。示例代碼如下:
from django.urls import path from front import views from django.conf.urls.static import static from django.conf import settingsurlpatterns = [path('', views.index), ] + static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)如果我們同時指定MEDIA_ROOT和upload_to,那么會將文件上傳到MEDIA_ROOT下的upload_to文件夾中。示例代碼如下:
class Article(models.Model):title = models.CharField(max_length=100)content = models.TextField()thumbnail = models.FileField(upload_to="%Y/%m/%d/")限制上傳的文件拓展名:
如果想要限制上傳的文件的拓展名,那么我們就需要用到表單來進行限制。我們可以使用普通的Form表單,也可以使用ModelForm,直接從模型中讀取字段。示例代碼如下:
# models.py class Article(models.Model):title = models.CharField(max_length=100)content = models.TextField()thumbnial = models.FileField(upload_to='%Y/%m/%d/',validators=[validators.FileExtensionValidator(['txt','pdf'])])# forms.py class ArticleForm(forms.ModelForm):class Meta:model = Articlefields = "__all__"上傳圖片:
上傳圖片跟上傳普通文件是一樣的。只不過是上傳圖片的時候Django會判斷上傳的文件是否是圖片的格式(除了判斷后綴名,還會判斷是否是可用的圖片)。如果不是,那么就會驗證失敗。我們首先先來定義一個包含ImageField的模型。示例代碼如下:
class Article(models.Model):title = models.CharField(max_length=100)content = models.TextField()thumbnail = models.ImageField(upload_to="%Y/%m/%d/")因為要驗證是否是合格的圖片,因此我們還需要用一個表單來進行驗證。表單我們直接就使用ModelForm就可以了。示例代碼如下:
class MyForm(forms.ModelForm):class Meta:model = Articlefields = "__all__"注意:使用ImageField,必須要先安裝Pillow庫:pip install pillow
為了更好的學習效果,請搭配視頻教程一起學習:
Django零基礎到項目實戰 - 網易云課堂?study.163.com總結
以上是生活随笔為你收集整理的上传文件和提交textfield_0基础掌握Django框架(37)文件上传的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 教授坦言:只要不退休,就始终会面临考核压
- 下一篇: 韩春雨要“翻案”?最新研究发现NgAgo