Django文件上传

模型字段 :

# models.pyfrom django.db import modelsclass UploadModel(models.Model):name = models.CharField(verbose_name="用户", max_length=32)"""先去启用media文件夹, 不启用就自动创建uploads 配合ModelForm使用upload_to="uploads/" 指定文件夹"""file = models.FileField(verbose_name="文件", upload_to="uploads/")def __str__(self):return self.namedef __repr__(self):return self.__str__()class Meta:verbose_name = "文件上传""""# 也可以这样创建, 但是不能指定文件夹# file2 = models.CharField(verbose_name="文件")"""

1. 手动实现

# views.pyfrom django import forms
from django.shortcuts import render, redirectfrom app01 import modelsdef upload(request):if request.method == "POST":# 获取表单数据username = request.POST.get('username')file = request.FILES.get('file')# 检查用户名和文件是否为空username_error = Nonefile_error = Noneif not username:username_error = "用户名不能为空"if not file:file_error = "文件不能为空"# 如果有错误,返回表单页面并传递错误信息if username_error or file_error:return render(request, 'upload.html', {'username': username,'username_error': username_error,'file_error': file_error})# 如果用户名和文件都存在,保存数据models.UploadModel.objects.create(name=username, file=file)# 上传成功,重定向到后台管理页面return redirect('/admin/app01/uploadmodel/')# 如果是 GET 请求,或者无效的 POST 请求,返回空表单(用于初次加载或错误后回填数据)return render(request, 'upload.html', {'username': request.POST.get('username', '')})

<!-- upload.html --><!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>文件上传</h1><form action="{% url 'upload' %}" method="post" enctype="multipart/form-data" novalidate>{% csrf_token %}<!-- 用户名字段 --><label for="username">用户名:</label><input type="text" id="username" name="username" value="{{ username }}">{% if username_error %}<p style="color: red;">{{ username_error }}</p>{% endif %}<br><!-- 文件上传字段 --><label for="file">上传文件:</label><input type="file" id="file" name="file">{% if file_error %}<p style="color: red;">{{ file_error }}</p>{% endif %}<br><button type="submit">上传</button>
</form></body>
</html>

2. 基于Form

# views.pyfrom django import forms
from django.shortcuts import render, redirectfrom app01 import modelsclass UploadForm(forms.Form):name = forms.CharField(label="用户")file = forms.FileField(label="文件")def upload_form(request):if request.method == "GET":form = UploadForm()return render(request, 'upload_form.html', {'form': form})form = UploadForm(request.POST, request.FILES)if form.is_valid():models.UploadModel.objects.create(name=form.cleaned_data.get('name'), file=form.cleaned_data.get('file'))return redirect('/admin/app01/uploadmodel/')return render(request, 'upload_form.html', {'form': form})
<!-- upload_form.html --><!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>Form上传</h1><form action="{% url 'upload_form' %}" method="post" enctype="multipart/form-data" novalidate>{% csrf_token %}{% for field in form %}<label for="">{{ field.label }}</label>{{ field }}<span style="color: red;">{{ field.errors.0 }}</span><br>{% endfor %}<button type="submit">上传</button>
</form></body>
</html>


3. 基于ModelForm

# views.pyfrom django import forms
from django.shortcuts import render, redirectfrom app01 import modelsclass UploadModelForm(forms.ModelForm):class Meta:model = models.UploadModelfields = "__all__"def upload_model_form(request):if request.method == "GET":form = UploadModelForm()return render(request, 'upload_model_form.html', {'form': form})form = UploadModelForm(request.POST, request.FILES)if form.is_valid():form.save()return redirect('/admin/app01/uploadmodel/')return render(request, 'upload_model_form.html', {'form': form})
<!-- upload_model_form.html --><!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>ModelForm上传</h1><form action="{% url 'upload_model_form' %}" method="post" enctype="multipart/form-data" novalidate>{% csrf_token %}{% for field in form %}<label for="">{{ field.label }}</label>{{ field }}<span style="color: red;">{{ field.errors.0 }}</span><br>{% endfor %}<button type="submit">上传</button>
</form></body>
</html>


4. 暴露文件夹

# 在urls.py中配置from django.urls import re_path
from django.views.static import serveurlpatterns = [re_path(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}, name='media'),
]
# 在settings.py中配置MEDIA_ROOT = os.path.join(BASE_DIR, "media")
MEDIA_URL = "/media/"

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Milvus向量数据库04-Pipelines搭建RAG应用

Milvus向量数据库04-Pipelines搭建RAG应用 Zilliz Cloud Pipelines 可以将文档、文本片段和图像等非结构化数据转换成可搜索的向量并存储在 Collection 中。本文将介绍 Zilliz Cloud Pipelines 的三种主要类型并提供示例代码&#xff0c;展示如何使用 Pipelines 搭建 RAG 应用。…

离线写博客(失败) - 用Markdown来离线写博客

因为想控制一下用网&#xff0c;但是又有写博客的需求&#xff0c;所以想研究一下离线写博客。 我看CSDN上面好像有很多介绍&#xff0c;Windows Live Writer 啦&#xff0c;Markdown啦&#xff0c;还有一些其他的&#xff0c;我看了一下&#xff0c;好像 Markdown还有点儿靠谱…

【洛谷】B3844 [GESP样题 二级] 画正方形(详细注释)

#include <iostream> using namespace std; int main() {//声明一个整型变量n&#xff0c;用于接收输入的数值&#xff0c;该数值将决定后续输出图案的行数和列数int n; cin >> n;//声明两个整型变量i和j&#xff0c;分别用作外层循环和内层循环的计数器int i, j;/…

Linux-音频应用编程

ALPHA I.MX6U 开发板支持音频&#xff0c;板上搭载了音频编解码芯片 WM8960&#xff0c;支持播放以及录音功能&#xff01;本章我们来学习 Linux 下的音频应用编程&#xff0c;音频应用编程相比于前面几个章节所介绍的内容、其难度有所上升&#xff0c;但是笔者仅向大家介绍 Li…

番茄社区双端视频APP源码_内附安装教程

新版视频源码|类似番茄APP视频付费软件APP源码教程 番茄社区双端视频APP源码&#xff0c;带安装教程&#xff0c;源码非组件&#xff0c;短视频、图片、交流、讨论、电影、电视剧。 没有什么问题宝塔就可以搭建&#xff0c;采集方面是火车头可以自己写规则&#xff01;

Onchain 正在蚕食 Offchain

目录 未来在链上 价值创造 技术加速 机构采用 小队&#xff1a;加速链上经济 我们正在进入一个代码就是货币、信任被编程、全球接入打破传统经济界限的时代。这种新兴模式就是我们所说的链上经济。 在此领域&#xff0c;Solana 因其在基础设施和应用程序方面的持续创新而脱颖而…

【LeetCode】80.删除有序数组中的重复项II

题目链接&#xff1a; 80.删除有序数组中的重复项II 题目描述&#xff1a; 解题思路&#xff1a; 按照题目中要求&#xff0c;必须在原来数组中进行修改&#xff0c;并且在O(1)额外空间条件下完成。因此我们可以使用双指针算法&#xff0c;算法具体流程如下&#xff1a; 如…

ORB-SLAM2 ---- 词袋模型BOW

文章目录 一、回环检测的重要性二、回环检测的方法三、词袋模型四、词典五、实例展示1. 计算评分2. 找出有相同单词的关键帧3. 用词袋进行快速匹配 六、总结 一、回环检测的重要性 在前面的学习我们知道&#xff0c;噪声的影响是不可消除的&#xff0c;而上一帧的误差不可避免的…

Android APP自学笔记

摘抄于大学期间记录在QQ空间的一篇自学笔记&#xff0c;当前清理空间&#xff0c;本来想直接删除掉的&#xff0c;但是感觉有些舍不得&#xff0c;因此先搬移过来。 Android导入已有外部数据库 2015.06.26在QQ空间记录&#xff1a;在Android中不能直接打开res aw目录中的数据…

php项目的sdk封装成composer包的创建与发版

将一个 PHP 项目的 SDK 封装成 Composer 包并发布的过程大致可以分为以下几个步骤。这个过程涉及到创建一个符合 Composer 规范的包&#xff0c;配置相关信息&#xff0c;并将其发布到 Packagist 或其他 Composer 仓库。以下是详细的步骤&#xff1a; ### 1. 准备 PHP SDK 项目…

STM32F103单片机使用STM32CubeMX新建IAR工程步骤

打开STM32CubeMX软件&#xff0c;选择File 选择新建工程 在打开的窗口输入单片机型号 在右下角选择单片机型号&#xff0c;然后点右上角 start project&#xff0c;开始新建工程。 接下来设置调试接口&#xff0c;在左边System Core中选择 SYS&#xff0c;然后在右右边debu…

轻量化特征融合 | YOLOv11 引入一种基于增强层间特征相关性的轻量级特征融合网络 | 北理工新作

本改进已同步到Magic框架 摘要—无人机图像中的小目标检测由于分辨率低和背景融合等因素具有挑战性,导致特征信息有限。多尺度特征融合可以通过捕获不同尺度的信息来增强检测,但传统策略效果不佳。简单的连接或加法操作无法充分利用多尺度融合的优势,导致特征之间的相关性不…

Tomcat项目本地部署

今天分享一下如何在本地&#xff0c;不依赖于idea部署聚合项目&#xff0c;以我做过的哈米音乐项目为例&#xff0c;项目结构如下&#xff1a; ham-core模块为公共模块&#xff0c;我们只需将另外三个模块&#xff1a;前台、后台、文件服务器打包&#xff0c;将打好的jar、war包…

进入保护模式

Intel CPU启动的时候是16位(实模式), 但是我们要工作在32位模式下 实模式下没有任何保护措施, 别人可能通过给数据段寄存器赋值上代码段地址, 然后来改变代码段的内容, 保护模式访问内容会检查权限之类的, 也会检查程序访问的内存范围是不是超了, 我们这个操作系统不会利用保…

MVC基础——市场管理系统(一)

文章目录 项目地址一、创建项目结构1.1 创建程序以及Controller1.2 创建View1.3 创建Models层,并且在Edit页面显示1.4 创建Layou模板页面1.5 创建静态文件css中间件二、Categories的CRUD2.1 使用静态仓库存储数据2.2 将Categorie的列表显示在页面中(List)2.3 创建_ViewImport.…

C#开发-集合使用和技巧(十)Union用法-并集

在 C# 中&#xff0c;IEnumerable 的 Union 方法用于返回两个序列的并集。Union 方法会去除重复的元素&#xff0c;确保结果集中每个元素都是唯一的。以下是 Union 方法的基本用法&#xff1a; 基本语法 public static IEnumerable<TSource> Union<TSource>(this…

高效查找的秘密武器二:布隆过滤器

最近学了这个布隆过滤器&#xff0c;所以小编来分享下这个神奇的数据结构 引入&#xff1a; 在我们日常生活中&#xff0c;当然这里特指是编程中时&#xff0c;经常遇到要判断一个元素是否在集合中&#xff0c;比如判断一个单词/词语&#xff0c;是否在已知的字典中&#xff1…

C++入门终

目录 一、引用 二、内联函数 三、auto关键字 四、指针空值nullptr 一、引用 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间 类型&引用变量名(对象名)…

C++实现排序算法:冒泡排序

目录 前言 冒泡排序性质 C代码实现冒泡排序 冒泡图解 第一趟排序 第二趟排序 第三趟排序 排序结果 结语 前言 冒泡排序的基本思想是通过从前往后&#xff08;从后往前&#xff09;两两比较&#xff0c;若为逆序&#xff08;即arr[i] < arr[i 1]&#xff09;则交换…

selenium+python实现12306自动化抢火车票(二)

往期回顾&#xff1a; seleniumpython实现12306自动化抢火车票&#xff08;一&#xff09; 1、根据乘车人姓名匹配&#xff0c;支持1人或多人选择 定位出所有乘车人的元素集&#xff0c;根据姓名集合去元素集里循环迭代匹配&#xff0c;匹配上了操作选中 ele_alldriver.find_e…