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>

 

 

 


posted @ 2022-05-13 16:04  费皿啊  阅读(103)  评论(0)    收藏  举报