学习笔记,仅供参考,有错必纠
文章目录
- 使用模型来处理上传的文件
- `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/发起请求:
查看work/paper文件夹内的内容:
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/发起请求:
传入不符合要求的文件:
得到错误信息: