Django从理论到实战(part50)--使用模型来处理上传的文件
學習筆記,僅供參考,有錯必糾
文章目錄
- 使用模型來處理上傳的文件
- `MEDIA_ROOT`和`MEDIA_URL`
- 限制文件的擴展名
使用模型來處理上傳的文件
在定義模型的時候,我們可以給存儲文件的字段指定為FileField,這個Field可以傳遞一個upload_to參數(shù),用來指定上傳上來的文件保存到哪里。
比如,我們讓文章保存到項目的work文件夾下,其模型類為:
class Work(models.Model):team_group = models.CharField('組別', max_length = 30)work_name = models.CharField('項目名稱', max_length = 50)add_time = models.DateTimeField(auto_now = True)paper = models.FileField("作品", upload_to = "paper")status = models.CharField('狀態(tài)', max_length = 20, default="未審核")def __str__(self):return "作品名稱:" + self.work_name其視圖函數(shù)為:
def testupload(request):if request.method == "GET":return render(request, "test_upload_paper.html")elif request.method == "POST":team_group = request.POST.get("team_group", "")work_name = request.POST.get("work_name", "")paper = request.FILES.get("paper", "")models.Work.objects.create(team_group = team_group,work_name = work_name,paper = paper)return HttpResponse("Success!")urls.py文件:
from django.urls import path from . import views app_name = 'school'urlpatterns = [path('login/', views.mylogin, name = "slogin"),path('testupload/', views.testupload), ]我們向http://127.0.0.1:8000/school/testupload/發(fā)起請求:
查看work/paper文件夾內(nèi)的內(nèi)容:
Very Well!
MEDIA_ROOT和MEDIA_URL
設置MEDIA_ROOT表示上傳到服務器的文件要保存在哪里;
MEDIA_URL表示如果我們要在瀏覽器中訪問上傳的文件,應該通過什么URL來訪問。
我們在settings.py文件中指定MEDIA_ROOT和MEDIA_URL:
MEDIA_ROOT = os.path.join(BASE_DIR, 'work') MEDIA_URL = '/work/'同時,為了能在瀏覽器上直接訪問靜態(tài)文件,我們應該在urls.py中添加如下url:
from django.contrib import admin from django.urls import path,include from . import views from django.conf.urls.static import static from django.conf import settingsurlpatterns = [path('admin/', admin.site.urls),path('', views.mainIndex), ] + static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)現(xiàn)在,即使我們不在FileField中傳入upload_to參數(shù),文件也會自動保存在項目的work文件夾中,但是如果我們指定了upload_to參數(shù)為'paper',那么文件就會上傳到work/paper目錄下。
如果,我們指定upload_to的參數(shù)為"%Y/%m/%d/",那么Django就會根據(jù)文件提交日期的不同,自動保存文件到對應日期的文件夾下。
限制文件的擴展名
如果想要限制上傳的文件的拓展名,那么我們就需要用到表單來進行限制。我們可以使用普通的Form表單,也可以使用ModelForm,直接從模型中讀取字段。
- 舉個例子
models.py
class Work(models.Model):team_group = models.CharField('組別', max_length = 30)work_name = models.CharField('項目名稱', max_length = 50)add_time = models.DateTimeField(auto_now = True)paper = models.FileField("作品", upload_to = "paper", validators = [validators.FileExtensionValidator(['doc', 'docx','pdf'],message = "必須為doc,docx,pdf格式的文件")])status = models.CharField('狀態(tài)', max_length = 20, default="未審核")forms.py
from django import forms from .models import Workclass WorkForm(forms.ModelForm):def get_errors(self):errors = self.errors.get_json_data()new_errors = {}for key,message_dicts in errors.items():messages = []for message in message_dicts:messages.append(message['message'])new_errors[key] = messagesreturn new_errorsclass Meta:model = Workfields = ['work_name', 'paper']views.py
def testupload(request):if request.method == "GET":return render(request, "test_upload_paper.html")elif request.method == "POST":workForm = forms.WorkForm(request.POST, request.FILES)#request.FILES用于驗證paper#request.POST用于驗證work_nameif workForm.is_valid():workForm.save()return HttpResponse("Success!")else:print(workForm.errors.get_json_data())return HttpResponse("Fail!")向http://127.0.0.1:8000/school/testupload/發(fā)起請求:
傳入不符合要求的文件:
得到錯誤信息:
總結(jié)
以上是生活随笔為你收集整理的Django从理论到实战(part50)--使用模型来处理上传的文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 男生有哲理微信昵称,伤感微信名506个
- 下一篇: 何家公鸡何家猜教案一等奖