Django教程第6章 | web开发实战-文件上传(导入文件、上传图片)

专栏系列:Django学习教程

导入文件

目标:导入部门清单excel,解析excel数据存储到数据库。

1.准备要导入的excel文件

2.编写模板HTML

            <div class="panel panel-default"><!-- Default panel contents --><div class="panel-heading"><span class="glyphicon glyphicon-th-list" aria-hidden="true"></span>批量上传</div><div class="panel-body"><form method="post" enctype="multipart/form-data" action="/dept/multi/">{% csrf_token %}<div class="form-group"><input type="file" name="exc"></div><input type="submit" value="上传" class="btn btn-info btn-sm"></form></div></div>

3.编写模型

from django.db import modelsclass Department(models.Model):name = models.CharField(verbose_name='部门名称', max_length=32)def __str__(self):return self.name

4. 编写视图函数

导入逻辑

1.根据标签<input type="file" name="exc">定义的 name 获取文件对象

2.对象传递给openpyxl,由openpyxl读取文件的内容。from openpyxl import load_workbook:解析excel库。

3.根据sheet遍历循环获取每一行数据

4.入库

def dept_multi(request):""" 批量删除(Excel文件)"""from openpyxl import load_workbook# 1.获取用户上传的文件对象file_object = request.FILES.get("exc")# 2.对象传递给openpyxl,由openpyxl读取文件的内容wb = load_workbook(file_object)sheet = wb.worksheets[0]# 3.循环获取每一行数据for row in sheet.iter_rows(min_row=2):text = row[0].valueexists = models.Department.objects.filter(name=text).exists()if not exists:models.Department.objects.create(name=text)return redirect('/dept/list/')

5.配置路由

在 settings.py中添加

urlpatterns = [path('dept/multi/', dept.dept_multi),]

 6.系统演示

上传图片

 以城市列表功能模块实战为例,演示上传图片和查询图片。

1.启用Media

启用media是可以让文件自动保存到我们配置的位置。

 在urls.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'),
]

settings.py中进行配置:

import osMEDIA_ROOT = os.path.join(BASE_DIR, "media")
MEDIA_URL = "/media/"

2.编写模板HTML

city_list.html

{% extends 'layout.html' %}{% block content %}<div class="container"><div style="margin-bottom: 10px"><a class="btn btn-success" href="/city/add/"><span class="glyphicon glyphicon-plus-sign" aria-hidden="true"></span>新建城市</a></div><div class="panel panel-default"><!-- Default panel contents --><div class="panel-heading"><span class="glyphicon glyphicon-th-list" aria-hidden="true"></span>城市列表</div><!-- Table --><table class="table table-bordered"><thead><tr><th>ID</th><th>Logo</th><th>名称</th><th>人口</th></tr></thead><tbody>{% for obj in queryset %}<tr><th>{{ obj.id }}</th><td><img src="/media/{{ obj.img }}" style="height: 80px;"></td><td>{{ obj.name }}</td><td>{{ obj.count }}</td></tr>{% endfor %}</tbody></table></div></div>
{% endblock %}

upload_form.html

{% extends 'layout.html' %}{% block content %}<div class="container"><div class="panel panel-default"><div class="panel-heading"><h3 class="panel-title"> {{ title }} </h3></div><div class="panel-body"><form method="post" enctype="multipart/form-data" novalidate >{% csrf_token %}{% for field in form %}<div class="form-group"><label>{{ field.label }}</label>{{ field }}<span style="color: red;">{{ field.errors.0 }}</span></div>{% endfor %}<button type="submit" class="btn btn-primary">提 交</button></form></div></div></div>{% endblock %}

3.编写模型

from django.db import modelsclass City(models.Model):""" 城市 """name = models.CharField(verbose_name="名称", max_length=32)count = models.IntegerField(verbose_name="人口")# 本质上数据库也是CharField,自动保存数据。img = models.FileField(verbose_name="Logo", max_length=128, upload_to='city/')

注意:编写模型后,执行如下命令,初始化表结构

$ python manage.py makemigrations

$ python manage.py migrate

4.编写视图函数

city_list函数:这里非常简单,直接使用models库查询出所有所有城市然后返回到给模板。

UpModelForm:定义一个上传表单,用于渲染模板页面。

city_add函数

1.如果是GET请求将form表单样式返回给模板。

2.如果是POST请求,1.将文件保存到启用的media的位置,2.将数据写入DB,3.转发给查询city_list查询最新数据并返回到模板。

from django.shortcuts import render, redirect
from ums import models
from ums.utils.bootstrap import BootstrapModelFormdef city_list(request):queryset = models.City.objects.all()return render(request, 'city_list.html', {'queryset': queryset})class UpModelForm(BootstrapModelForm):# img排除input样式bootstrap_exclude_fields = ['img']class Meta:model = models.Cityfields = "__all__"def city_add(request):title = "新建城市"if request.method == "GET":form = UpModelForm()return render(request, 'upload_form.html', {"form": form, 'title': title})form = UpModelForm(data=request.POST, files=request.FILES)if form.is_valid():# 对于文件:自动保存;# 字段 + 上传路径写入到数据库form.save()return redirect("/city/list/")return render(request, 'upload_form.html', {"form": form, 'title': title})

5.配置路由

from django.urls import path, re_path
from django.views.static import serve
from django.conf import settings
from ums.views import cityurlpatterns = [re_path(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}, name='media'),# 城市列表path('city/list/', city.city_list),path('city/add/', city.city_add),]

6.系统演示

新增城市

城市列表查询 

如果需要完整代码可以评论区给我留言!

如果本文对你有帮助,记得点赞+关注,你的支持是我最大的动力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/621830.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Embedding Watermarks into Deep Neural Networks

将水印嵌入深度神经网络 ABSTRACT 最近在深度神经网络领域取得了显著的进展。分享深度神经网络的训练模型对于这些系统的快速研究课并发进展至关重要。与此同时&#xff0c;保护共享训练模型的权利也变得十分必要。为此我们提议使用数字水印技术来保护知识产权&#xff0c;并…

vue3-模板引用

//1.调用ref函数 -> ref对象 const h1Ref ref(null) const comRef ref(null) //组件挂载完毕之后才能获取 onMounted(()>{console.log(h1Ref.value);console.log(comRef.value); })<div class"father"><!-- 通过ref标识绑定ref对象 --><h2 re…

【angular教程240111】08异步数据流编程与angular :promise,Rxjs6.x

【angular教程240111】08异步数据流编程与angular &#xff1a;promise&#xff0c;Rxjs6.x 目录标题 一级目录二级目录三级目录 〇、编程里的异步1异步编程常见的几种方法2 代码示例其中的一些方法&#xff1a;1. 回调函数&#xff08;Callback Functions&#xff09;2. 事件监…

【工具栏】SequenceDiagram插件的使用(根据代码生成时序图)

1. 安装 2.使用 进入代码页面&#xff0c;点击鼠标右键 选择方法 根据方法中的代码生成时序图

2024年【山东省安全员C证】考试及山东省安全员C证复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 山东省安全员C证考试是安全生产模拟考试一点通总题库中生成的一套山东省安全员C证复审考试&#xff0c;安全生产模拟考试一点通上山东省安全员C证作业手机同步练习。2024年【山东省安全员C证】考试及山东省安全员C证复…

docker部署私人云盘

目录 1.安装 2.登陆 1.安装 mkdir -p /opt/alist docker run -d --restartalways -v /opt/alist:/opt/alist/data -p 5244:5244 --name"alist" xhofe/alist:latest 2.登陆 ip:5224 默认账户admin 密码在日志中

test-04-test case generate 测试用例生成 tcases 快速开始

拓展阅读 junit5 系列 基于 junit5 实现 junitperf 源码分析 Auto generate mock data for java test.(便于 Java 测试自动生成对象信息) Junit performance rely on junit5 and jdk8.(java 性能测试框架。性能测试。压测。测试报告生成。) 自动生成测试用例 入门指南 关于…

nodemon使用

为什么要使用 nodemon 在编写调试 Node.js 项目的时候&#xff0c;如果修改了项目的代码&#xff0c;则需要频繁的手动 close 掉&#xff0c;然后再重新启动&#xff0c;非常繁琐。 现在&#xff0c;我们可以使用 nodemon&#xff08;https://www.npmjs.com/package/nodemon&a…

js中关于字符串的创建和判断类型

文章目录 创建方法判断类型的技巧区分1、typeof2、instanceof 共点1、Object.prototype.toString.call2、库函数 参考链接&#xff1a;JS字符串的创建和常用方法 如何判断JS中一个变量是 string 类型 创建方法 字符串有着两种的创建方法&#xff0c;一个是使用构造函数&#x…

openssl3.2 - 官方demo学习 - server-arg.c

文章目录 openssl3.2 - 官方demo学习 - server-arg.c概述笔记备注END openssl3.2 - 官方demo学习 - server-arg.c 概述 TLS服务器, 等客户端来连接; 如果客户端断开了, 通过释放bio来释放客户端socket, 然后继续通过bio读来aceept. 笔记 对于开源工程, 不可能有作者那么熟悉…

力扣452. 用最少数量的箭引爆气球

排序 贪心 思路&#xff1a; 将数组元素按照右边界进行排序&#xff1b;第一支箭从第一个气球的右边界 pos 射出&#xff0c;如果下一个气球的左边界比 pos 要大&#xff0c;则这个气球不会被这支箭射中&#xff0c;否则会被射中&#xff08;因为排过序 pos ∈ [left, right]…

HCIA-Datacom题库(自己整理分类的)_09_Telnet协议【14道题】

一、单选 1.某公司网络管理员希望能够远程管理分支机构的网络设备&#xff0c;则下面哪个协议会被用到&#xff1f; RSTP CIDR Telnet VLSM 2.以下哪种远程登录方式最安全&#xff1f; Telnet Stelnet v100 Stelnet v2 Stelnet v1 解析&#xff1a; Telnet 明文传输…

中职组安全-win20230217-环境-解析

*任务说明&#xff1a; 仅能获取win20230217的IP地址 用户名&#xff1a;test&#xff0c;密码&#xff1a;123456 访问服务器主机,找到主机中管理员名称,将管理员名称作为Flag值提交&#xff1b; john 访问服务器主机,找到主机中补丁信息,将补丁编号作为Flag值提交&#xff…

【数字人】9、DiffTalk | 使用扩散模型基于 audio-driven+对应人物视频 合成说话头(CVPR2023)

论文&#xff1a;DiffTalk: Crafting Diffusion Models for Generalized Audio-Driven Portraits Animation 代码&#xff1a;https://sstzal.github.io/DiffTalk/ 出处&#xff1a;CVPR2023 特点&#xff1a;需要音频对应人物的视频来合成新的说话头视频&#xff0c;嘴部抖…

《Git学习笔记:Git入门 常用命令》

1. Git概述 1.1 什么是Git&#xff1f; Git是一个分布式版本控制工具&#xff0c;主要用于管理开发过程中的源代码文件&#xff08;Java类、xml文件、html页面等&#xff09;&#xff0c;在软件开发过程中被广泛使用。 其它的版本控制工具 SVNCVSVSS 1.2 学完Git之后能做…

R语言【paleobioDB】——pbdb_intervals():通过参数选择,返回多个地层年代段的基本信息

Package paleobioDB version 0.7.0 paleobioDB 包在2020年已经停止更新&#xff0c;该包依赖PBDB v1 API。 可以选择在Index of /src/contrib/Archive/paleobioDB (r-project.org)下载安装包后&#xff0c;执行本地安装。 Usage pbdb_interval (id, ...) Arguments 参数【..…

顺序表的实现(上)(C语言)

本文章主要对顺序表的介绍以及数据结构的定义,以及几道相关例题,帮助大家更好理解顺序表. 文章目录 前言 一、顺序表的静态实现 二、顺序表的动态实现 三.定义打印顺序表函数 四.定义动态增加顺序表长度函数 五.创建顺序表并初始化 六.顺序表的按位查找 七.顺序表的按值…

【数值分析】区间折半法,matlab实现

区间折半法 从梯形公式出发&#xff0c;上一步步长为 h {h} h &#xff0c;则有步长折半后的积分 T 2 n 1 2 T n h 2 ∑ i 0 n − 1 f ( x i 0.5 ) T_{2n} \frac{1}{2}T_n \frac{h}{2} \sum_{i0}^{ n-1}f(x_{i0.5}) T2n​21​Tn​2h​i0∑n−1​f(xi0.5​) matlab实现 …

力扣 第 121 场双周赛 解题报告 | 珂学家 | 数位DP

前言 整体评价 T3, T4 都是典题 T1. 大于等于顺序前缀和的最小缺失整数 思路: 模拟 class Solution { public:int missingInteger(vector<int>& nums) {set<int> s(nums.begin(), nums.end());int acc nums[0];for (int i 1; i < nums.size(); i) {if …

Win10专业版系统搭建DNS解析服务

Win10专业版 纯新手&#xff0c;也没弄过Linux的。不喜勿喷&#xff0c;有问题请指出 第一天一头雾水整了几个小时没结果&#xff0c;第二天豁然开朗&#xff0c;10分钟明白了第一天的问题所在。 Win10 安卓&#xff1a; iOS&#xff1a; 搭建DNS服务器的意义&#xff1a; 屏蔽…