5-12ModelForm上传案例
在django的开发过程中两个特殊的文件夹:
- static,存放静态文件的路径,包括:CSS、JS、项目的图片(例如背景图片)。
- media,用户上传的数据的目录。
2.2启用media目录有以下操作
在url.py中进行配置:
from django.urls import path, re_path from django.views.static import serve from django.conf import settings urlpatterns = [ re_path(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}, name='media'), ]
注释:


效果如下:

在setting.py中进行配置路径:
import os MEDIA_ROOT = os.path.join(BASE_DIR, "media") #指的就是当前这个项目的media目录 MEDIA_URL = "/media/"


把static中1.png图片迁移到media的文件下,用户可以在浏览器上访问这个地址:127.0.0.1:8000/media/1.png访问图片如下:

在upload,py中直接进行图片路径的拼接:


路径拼接有两种方式:绝对路径和相对路径,但都可以把图片导入到media目录当中去。

效果如图所示

案例:混合数据(Form)的后台修改:
所有代码如下:
import os from django.conf import settings from django.contrib.sites import requests from django.shortcuts import render, HttpResponse from app01 import models from django import forms from app01.utils.bootstrap import BootstrapForm class UpForm(BootstrapForm): bootstrap_exclude_fields = ['img'] name = forms.CharField(label="姓名") age = forms.IntegerField(label="年龄") img = forms.FileField(label="头像") def upload_form(request): title = "Form上传" if request.method == "GET": form = UpForm return render(request, 'upload_form.html', {"form": form, "title": title}) # 把参数form和title渲染到HTML里 form = UpForm(data=request.POST, files=request.FILES) if form.is_valid(): # {'name':'武沛齐','age':123,'img':<InMemoryUploadedFile:图片1.png (image/png)>} 获取到的数据 print(form.cleaned_data) # 读取到内容,自己处理每个字段的数据,让它进行存储,即导入到数据库. # 1.读取图片内容,写入到文件夹中并获取文件的路径。 image_object = form.cleaned_data.get("img") # 直接进行图片路径的拼接: #media_path = os.path.join(settings.MEDIA_ROOT, image_object.name) # 绝对路径,图片进入到media目录中 media_path = os.path.join("media", image_object.name) # 相对路径,图片进入到media目录中 f = open(media_path, mode='wb') for chunk in image_object.chunk(): f.write(chunk) f.close() # 循环读取文件往本地新文件中写 # 2.将图片文件路径写入到数据库(拼接路径) models.Boss.objects.create( name=form.cleaned_data['name'], age=form.cleaned_data['age'], img=media_path, ) # 前面两个原封不动,数据都在cleaned_data中,最后一个文件用路径写入到数据库 return HttpResponse("...") return render(request, 'upload_form.html', {"form": form, "title": title})
案例:混合数据(ModelForm)
增加菜单页,在layout.html中进行添加.
<li><a href="/upload/model/form/">ModalForm上传</a></li>

浙公网安备 33010602011771号