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表单上传文件和基于ajax上传文件