0
点赞
收藏
分享

微信扫一扫

Django从理论到实战(part50)--使用模型来处理上传的文件

学习笔记,仅供参考,有错必纠


文章目录

  • ​​使用模型来处理上传的文件​​
  • ​​`MEDIA_ROOT`和`MEDIA_URL`​​
  • ​​限制文件的扩展名​​

使用模型来处理上传的文件



在定义模型的时候,我们可以给存储文件的字段指定为​​FileField​​​,这个​​Field​​​可以传递一个​​upload_to​​参数,用来指定上传上来的文件保存到哪里。

比如,我们让文章保存到项目的​​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('状态', max_length = 20, default="未审核")

def __str__(self):
return "作品名称:" + self.work_name



其视图函数为:

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/发起请求:

Django从理论到实战(part50)--使用模型来处理上传的文件_python



查看work/paper文件夹内的内容:

Django从理论到实战(part50)--使用模型来处理上传的文件_扩展名_02

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/'



同时,为了能在浏览器上直接访问静态文件,我们应该在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 settings

urlpatterns = [
path('admin/', admin.site.urls),
path('', views.mainIndex),
] + static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)



现在,即使我们不在​​FileField​​​中传入​​upload_to​​​参数,文件也会自动保存在项目的work文件夹中,但是如果我们指定了​​upload_to​​​参数为​​'paper'​​​,那么文件就会上传到​​work/paper​​目录下。

如果,我们指定​​upload_to​​​的参数为​​"%Y/%m/%d/"​​,那么Django就会根据文件提交日期的不同,自动保存文件到对应日期的文件夹下。



限制文件的扩展名



如果想要限制上传的文件的拓展名,那么我们就需要用到表单来进行限制。我们可以使用普通的​​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('状态', max_length = 20, default="未审核")



forms.py

from django import forms
from .models import Work

class 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] = messages
return new_errors

class Meta:
model = Work
fields = ['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_name
if 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/发起请求:

Django从理论到实战(part50)--使用模型来处理上传的文件_上传_03



传入不符合要求的文件:

Django从理论到实战(part50)--使用模型来处理上传的文件_django_04

得到错误信息:

Django从理论到实战(part50)--使用模型来处理上传的文件_上传_05

举报

相关推荐

0 条评论