Django Form表单上传文件

Posted Jason_WangYing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django Form表单上传文件相关的知识,希望对你有一定的参考价值。

最近在用Django来上传文件,因为这个使用的很少,所以直接用Form表单来上传文件到服务器本地。

添加新的App到Django项目,包含urls文件。

先创建model文件

# 店里服务器传输文件用
class Store_Server_Transfer_File(models.Model):

    file_record = models.CharField(max_length=100,blank=True,null=True,verbose_name='备注')
    file_http = models.CharField(max_length=200,blank=True,null=True,verbose_name='在线地址')
    is_download = models.BooleanField(default=False, verbose_name='文件是否自动下载')
    file_createtime = models.DateTimeField(auto_now_add = True,verbose_name = '创建时间')


    class Meta:
        # db_table = 'equipments'  # 定义表名
        verbose_name = '文件传输'  # 后台显示名称
        verbose_name_plural = verbose_name  # 表示复数

    def file_url(self):
        try:
            file_name = self.file_http.split('/')[-1]
        except:
            file_name = self.file_http
        return format_html('<a href="{}" download="{}">{}</a>'.format(self.file_http,file_name,self.file_http))

    file_url.allow_tags = True
    file_url.short_description = '在线地址'

然后在admin.py文件里面添加后台的上传和删除按钮

from django.contrib import admin
from django.http import HttpResponse
from django.forms.models import model_to_dict
from .models import *

# Register your models here.
# 店内服务器传输文件用
@admin.register(Store_Server_Transfer_File)
class Server_Transfer_File(admin.ModelAdmin):

    list_display = ['id','file_record','file_url','file_createtime']
    # 排序
    ordering = ('-id',)

    actions = ['add_file','delete_file']
    # 按钮的点击事件
    def add_file(self, modeladmin, request, queryset):
        return True
    # 按钮的配置
    add_file.short_description = '新增文件'
    add_file.type = 'danger'
    add_file.style = 'color:rainbow;'
    add_file.action_type = 0
    add_file.action_url = '/haipiya_compare/upload_file'
    # 按钮的点击事件
    def delete_file(self, request, queryset):
        queryset.delete()
        for data in queryset.all():
            print(data)
            print(data.file_url)
        return HttpResponse('{}    文件删除成功!!!!{}'.format(queryset.count(),model_to_dict(data)))

    # 按钮的配置
    delete_file.short_description = '删除文件'

    list_display_links = None  # 禁用编辑链接
    def has_add_permission(self, request):
        # 禁用添加按钮
        return False
    def has_delete_permission(self, request, obj=None):
        # 禁用删除按钮
        return False

在view文件夹里面定义上传页面的模板路径和上传方法。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/4/2 下午1:42
# @Author  : wangying
# @Site    : 
# @File    : upload.py
# @Software: PyCharm
from django.views import View
from django.http import HttpResponse,HttpResponseRedirect,JsonResponse
from django.shortcuts import render,redirect
from .models import Store_Server_Version,Store_Version_Record,Store_Server_Transfer_File
import os



class Upload(View):    #定义上传文件的视图类,用于平日互传文件用
    def get(self,request):    #定义类试图的get方法
        return render(request,"fileUpload.html")   #当调用类视图的get请求时跳转到front/upload2.html
    def post(self,request):    #定义类试图的post方法
        file_record = request.POST.get('file_record', '')
        myfile=request.FILES.get("myfile",'')    #将请求上传的文件赋值给myfile
        if file_record == '':
            return HttpResponse('文件上传信息不能为空')
        elif myfile == '':
            return HttpResponse('未选择上传的文件,请重新选择后上传')
        file_name = myfile.name
        # 检测文件是否存在,如果存在就自动变更名称
        file_name = self.file_check(file_name)
        with open("static/file_upload/"+file_name,"wb") as fp:   #打开static目录下的文件,文件用myfile名称,并设置简称为fp
            for chunk in myfile.chunks():    #遍历myfile的数据流
                fp.write(chunk)   #将数据流写入到fp文件中
        # TODO:存储数据,并返回上一页
        server_version = Store_Server_Transfer_File()
        print(request.POST)
        server_version.file_record = file_record
        server_version.file_http = 'http://{}/static/file_upload/{}'.format(request.META.get('HTTP_HOST'),file_name)
        server_version.save()

        return HttpResponseRedirect('/admin#/haipiya_compare/version_changelist.html')
        # return HttpResponse("{}创建成功   <a href='http://127.0.0.1:8000/static/client_upload/{}'>上传成功的页面地址</a>".format(myfile,file_name))   #返回HTTP响应,响应内容为myfile创建成功

    def file_check(self,file_name):
        temp_file_name = file_name
        i = 1
        while i:
            print(temp_file_name)
            print(os.path.exists("static/client_upload/" + temp_file_name))
            if os.path.exists("static/client_upload/" + temp_file_name):
                name, suffix = file_name.split('.')
                name += '(' + str(i) + ')'
                temp_file_name = name + '.' + suffix
                i = i + 1
            else:
                return temp_file_name

在APP的urls文件里面解析路由

urlpatterns = [

    # 上传文件页面
    url('upload_file$',upload.Upload.as_view()),

]

这样就配置完了,model文件生成数据库记录上传历史,admin文件生成后台文件上传记录列表并显示上传按钮,view文件指定上传文件模板路径和接收post文件源数据,urls文件指定解析路由。

点击下载源文件 https://download.csdn.net/download/Jason_WangYing/19144573

 

 

 

 

以上是关于Django Form表单上传文件的主要内容,如果未能解决你的问题,请参考以下文章

Django Form表单上传文件

django 基于form表单上传文件和基于ajax上传文件

python测试开发django-178.ajax实现form表单文件上传

django中通过文件和Ajax来上传文件

在Django中读取使用html表单上传的Excel文件

django Form组件 上传文件