django实现form表单上传文件(完整详细)

本博文源于django基础内容,讲解文件上传功能!

实验效果

将文件上传到django项目中
在这里插入图片描述

实验步骤

  • 创建项目test.
  • 创建应用程序app01
  • 配置settings.py
  • 配置test/urls.py
  • 配置app01/views.py
  • 配置template中的html文件
  • 验证结果收获喜悦

创建项目test01

在这里插入图片描述

django-admin startproject test01 .

效果
在这里插入图片描述

创建应用程序app01

在这里插入图片描述

>python manage.py startapp app01

效果:
在这里插入图片描述

配置settings.py

在INSTALLED_APPS选项中,链接应用app01

完整如下:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config', # 新增
]

在MIDDLEWARE选项中,注释csrf

防止form表单提交失败
完整如下:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

#为新增

在TEMPLATES选项中,填写DIRS完整内容,

为了能引用表单html文件

TEMPLATES = [
    {
    
    
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')], # 新修改
        'APP_DIRS': True,
        'OPTIONS': {
    
    
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

尝试运行django,是否正常

在这里插入图片描述

一切正常的话,我们继续(如果没有这个页面,说明环境有问题)。不如重新创建项目,立马python manage.py runserver试一下

配置test01/urls.py

让我们网页打开能跑到表单中去

from django.contrib import admin
from django.urls import path

from app01 import views  # 新增

urlpatterns = [
    path('', views.index.as_view()),  # 新增
    path('admin/', admin.site.urls),
]

配置app01/views.py

这里是核心,我们采用CBV方式编写代码,所谓的CBV就是基于类编写。下面只要分清楚get和post就行了,
get:

  1. 返回页面

post:

  1. 取出文件句柄
  2. 进行文件扫描读取
  3. 返回读取成功结果

完整代码如下:

from django.http import HttpResponse
from django.shortcuts import render

# Create your views here.
from django.views import View


class index(View):

    def get(self, request):
        return render(request, 'upload.html')

    def post(self, request):
        file = request.FILES.get('f1')
        with open(file.name, 'wb') as f:
            for i in file:
                f.write(i)

        return HttpResponse('ok')

在test下创建templates文件夹,并创建upload.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
        {
    
    % csrf_token %}   
    <input type="file" name="f1">   
    <button>上传</button></form>


</body>
</html>

form表单里共有四行代码

  1. 第一行enctype包含让我们能上传文件成功
  2. 第二行防止跨站伪造
  3. 第三行就是文件的保存地方,name必须设置,后台调用句柄
  4. 第四行就是button,不多说

测试资源

在这里插入图片描述
另存为1.jpg即可

测试收获喜悦

在这里插入图片描述

在这里插入图片描述

总结,敲黑板

回想整篇博文实现过程,核心逻辑在views.py书写,views.py文件要多去看一下,其他都是边边角角修饰!

猜你喜欢

转载自blog.csdn.net/m0_37149062/article/details/107607487#comments_23100549