【Django 网页Web开发】24. 实战项目:moudleForm的文件上传应用到城市管理(17)(保姆级图文)

目录

    • 用户上传文件存放media如何启用
      • 1. 在urls.py中进行配置:
      • 2. 在settings.py中进行配置:
      • 3. 能够通过media的url访问文件
  • moudleForm上传文件实现城市管理
    • 1. moudle.py
    • 2. url.py
    • 3. city.py
    • 4. city.html
    • 5. 文件上传小结
    • 6. 城市管理效果
    • 总结


欢迎关注 『Django 网页Web开发』 系列,持续更新中
欢迎关注 『Django 网页Web开发』 系列,持续更新中

在这里插入图片描述
在这里插入图片描述

用户上传文件存放media如何启用

配置好后就可以在浏览器中访问这个地址。
要记得创建media文件夹
在这里插入图片描述

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

在这里插入图片描述

2. 在settings.py中进行配置:

import os

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

在这里插入图片描述

3. 能够通过media的url访问文件

http://127.0.0.1:8000/media/city/Django.png

在这里插入图片描述


moudleForm上传文件实现城市管理

1. moudle.py

与form的关键区别:

  1. 文件存储定义的字段类型是FileField。虽然本质上数据库也是CharField,自动保存数据的路径。FileField的好处在于不逊要我们手动写保存数据的过程,moudleForm帮我们完成这个保存文件的过程。
  2. upload_to='city/'字段的意思是可以帮我们把文件保存在media/city/的文件夹目录下
class City(models.Model):
    """ 城市 """
    name = models.CharField(verbose_name="名称", max_length=32)
    count = models.IntegerField(verbose_name="人口")

    img = models.FileField(verbose_name="Logo", max_length=128, upload_to='city/')

2. url.py

    path('upload/modal/form/', upload.upload_modal_form),
    # 城市列表
    path('city/list/', city.city_list),
    path('city/add/', city.city_add),

3. city.py

加入files=request.FILESform.save()即可快捷地实现文件的上传。
在这里插入图片描述

from django.shortcuts import render, redirect
from app01 import models
from app01.utils.bootstrap import BootStrapModelForm


def city_list(request):
    queryset = models.City.objects.all()
    return render(request, 'city_list.html', {'queryset': queryset})


class UpModelForm(BootStrapModelForm):
    bootstrap_exclude_fields = ['img']

    class Meta:
        model = models.City
        fields = "__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})


4. city.html

顺带在模板页面中生成了两个页面一个用于moudle 一个 用于城市管理

                <li><a href="/upload/modal/form/">ModalForm上传</a></li>
                <li><a href="/city/list/">城市管理</a></li>

在这里插入图片描述

city.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 %}


5. 文件上传小结

  • 一般文件上传

    file_object = request.FILES.get("exc")
    ...
    
  • Form组件= 一般文件上传+表单验证

    request.POST
    file_object = request.FILES.get("exc")
    
    具体文件操作还是手动自己做。
    
  • ModelForm=表单验证 + 自动保存数据库 + 自动保存文件(一般文件上传的替代)

    - Media文件夹
    - Models.py定义类文件要
    	img = models.FileField(verbose_name="Logo", max_length=128, upload_to='city/')
    

6. 城市管理效果

图片的超链接使用media来呈现出来
在这里插入图片描述


总结

大家喜欢的话,给个👍,点个关注!给大家分享更多有趣好玩的Python 网页Web开发知识!

版权声明:

发现你走远了@mzh原创作品,转载必须标注原文链接

Copyright 2023 mzh

Crated:2023-3-1

欢迎关注 『Django 网页Web开发』 系列,持续更新中
欢迎关注 『Django 网页Web开发』 系列,持续更新中
『01. 安装配置Django』
『02. 创建并运行一个Django项目』
『03. 初识Django』
『04. 请求和响应,网页跳转重定向,实战简易表单模拟登陆』
『05. 数据库操作,实战用户管理』
『06. 报错:You have 26 unapplied migration(s). Your project may not work properly until you apply the migra』
『07. 模板语法』
『08. 实战项目:部门和员工管理系统(01)』
『09. 实战项目:员工编辑删除功能与靓号管理(02)』
『10. 实战项目:靓号搜索功能(03)』
『11. 实战项目:分页与页码跳转功能(04)』
『12. 实战项目:分页组件的封装 面向接口编程(05)』
『13. 实战项目:添加用户时的时间选择组件(06)』
『14. 实战项目:一些面向对象的代码结构优化(07)』
『15. 实战项目:管理员增删改查,md5密码和密码重置(08)』
『16. 实战项目:BootStrap类的进一步优化(09)』
『17. 实战项目:login业务涉及cookie、session、中间件(10)』
『18. 实战项目:登录时的验证码(11)』
『19. 实战项目:初识Ajax请求(12)』
『20. 实战项目:Ajax实战之订单管理与弹出对话框(13)』
『21. 实战项目:echart数据图表(14)』
『22. 实战项目:简单的文件上传(15)』
『23. 实战项目:Excel和form和moudleForm的文件上传(16)』
『24. 实战项目:moudleForm的文件上传应用到城市管理(17)』
【更多内容敬请期待】


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Java菜匣子优选系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

人脸识别4:Android InsightFace实现人脸识别Face Recognition(含源码)

人脸识别4&#xff1a;Android InsightFace实现人脸识别Face Recognition(含源码) 目录 人脸识别4&#xff1a;Android InsightFace实现人脸识别Face Recognition(含源码) 1. 前言 2. 项目说明 &#xff08;1&#xff09;开发版本 &#xff08;2&#xff09;依赖库说明(O…

Docker部署gitlab-runner

gitlab-runner 1.部署 Linux使用二进制的方式Docker中使用容器的方式启动gitlab-runnerHelm包的方式安装gitlab-runner Docker中使用容器的方式启动gitlab-runner 1.安装gitlab runner docker run -d --name gitlab-runner --restart always \ -v /srv/gitlab-runner/conf…

When viruses are good for you 病毒,有时对人体是有益的 | 经济学人20230506版社论双语精翻

本篇来自《经济学人》&#xff08;The Economist&#xff09;2023年5月6日社论&#xff08;Leaders&#xff09;精选&#xff1a;《病毒&#xff0c;有时对人体是有益的》&#xff08;When viruses are good for you&#xff09;。 Bacteriophages 噬菌体 When viruses are goo…

202319读书笔记|《春之海终日优哉游哉:谢芜村俳句300》——远山峡谷间樱花绽放,宇宙在其中

202319读书笔记&#xff5c;《春之海终日优哉游哉&#xff1a;谢芜村俳句300》——远山峡谷间樱花绽放&#xff0c;宇宙在其中 与谢芜村&#xff0c;小林一茶&#xff0c;芭蕉&#xff0c;与谢野晶子&#xff0c;俳句都很赞&#xff0c;虽多本书中略有重复&#xff0c;但多多观…

Android插件化框架-Shadow原理解析

作者&#xff1a;dennyz 1、前言 所谓插件化&#xff0c;是实现动态化的一种具体的技术手段。 对于移动端的App而言&#xff0c;无论是Android还是iOS&#xff0c;都存在一个共同的问题&#xff0c;那就是更新的周期较长。 当我们希望快速为App更新功能时&#xff0c;必须经…

【redis】redis的5种数据结构及其底层实现原理

文章目录 redis中的数据结构redis数据结构底层实现stringlisthashsetintset字典 zset跳表插入删除过程 redis中的数据结构 Redis支持五种数据类型&#xff1a;string&#xff08;字符串&#xff09;&#xff0c;hash&#xff08;哈希&#xff09;&#xff0c;list&#xff08;…

Python如何制作图标点选验证码

本文讲解如何使用python中的opencv库来制作图标点选验证码 图标点选验证码制作起来非常简单,你只需要准备两部分数据集,数据集数量都不用很多,背景图我选择了20个左右,大小为(300, 500)左右,图标我抓取了100多个,图标大小为(40,40)左右,图标由不同大小的透明度构成…

C++:IO流

目录 一. C语言的输入输出方式 二. C的输入输出 2.1 C标准IO流 2.2 文件IO流 2.3 字符串IO流 一. C语言的输入输出方式 一般C语言通过scanf和printf来实现输入输出&#xff0c;scanf和printf都需要显示地指定数据类型。同时&#xff0c;C语言还支持fscanf/fprintf以及ssc…

【大数据】可视化仪表板 - Superset的安装和使用

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…

MYSQL中 find_in_set() 函数用法详解

MYSQL中 find_in_set() 函数用法详解 官方涵义&#xff08;MySQL手册中语法说明&#xff09; FIND_IN_SET(str,strlist) &#xff1a; str 要查询的字符串&#xff0c;strlist 需查询的字段&#xff0c;参数以”,”分隔&#xff0c;形式如 (1,2,6,8,10,22)&#xff1b;该函数的…

接口如何运用pytest+HttpRunner展开测试?

目录 前言&#xff1a; 一、 什么是接口测试 二、 引入自动化背景 三、 自动化技术选型 四、 自动化测试用例 五、自动化成果 前言&#xff1a; pytest和HttpRunner都是Python编程语言中常用的接口测试框架。 pytest是一种成熟的、灵活的、社区支持良好的测试框架&…

vr沉浸式仿真实训展厅中控系统提高课堂纪律

为解决实训教学过程中“看不到、进不去、成本高、危险大”的问题&#xff0c;VR智能中控系统为职业教育及高等教育老师提供一个数字化、沉浸式、集中管控的实训教学工具。 VR智能中控系统通过对VR教学课堂的实时监控、数据的收集和分析&#xff0c;为气象学院的教学提供更多帮助…

2023年05月份青少年软件编程Scratch试卷三级真题

2023-05 Scratch三级真题 分数&#xff1a;100 题数&#xff1a;38 测试时长&#xff1a;60min 一、单选题(共25题&#xff0c;共50分) 1. 关于变量&#xff0c;下列描述错误的是&#xff1f;&#xff08;A&#xff09;&#xff08;2分&#xff09; &#xff08;变量那一栏…

【深度学习】基于Qt的人脸识别系统,门禁人脸识别系统,Python人脸识别流程,树莓派

文章目录 人脸识别过程人脸检测人脸对齐人脸特征提取特征距离比对人脸识别系统 人脸识别过程 在深度学习领域做人脸识别的识别准确率已经高到超出人类识别&#xff0c;但综合考虑模型复杂度&#xff08;推理速度&#xff09;和模型的识别效果&#xff0c;这个地方还是有做一些…

基于Java物流管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

STM32单片机(四)第一节:OLED调试工具

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

从业务出发,K8S环境自建和非自建整体架构设计比较

新钛云服已累计为您分享751篇技术干货 随着数字化转型的大潮到来&#xff0c;越来越多的企业开始上云&#xff0c;同时也纷纷加入到微服务和K8S队伍中。但在K8S整体环境究竟应该用自建的还是非自建&#xff1f;以及他们需要用到的服务&#xff0c;究竟应该自建还是直接用PAAS服…

C++【STL】之list的使用

文章目录&#xff1a; list介绍list使用1. 默认成员函数1.1 构造函数1.2 拷贝构造1.3 赋值重载1.4 析构函数 2. 迭代器3. 容量操作4. 数据访问5. 数据修改5.1 插入删除5.2 交换调整清理 6. 其他操作6.1 链表拼接6.2 链表移除6.3 排序6.4 链表逆置 list介绍 list是可以在常数范围…

java 版本企业电子招投标采购系统源码之登录页面

​ 信息数智化招采系统 服务框架&#xff1a;Spring Cloud、Spring Boot2、Mybatis、OAuth2、Security 前端架构&#xff1a;VUE、Uniapp、Layui、Bootstrap、H5、CSS3 涉及技术&#xff1a;Eureka、Config、Zuul、OAuth2、Security、OSS、Turbine、Zipkin、Feign、Monitor、…