直接做那个视频网站,php网站 php有什么用,找建筑网官网,wordpress删除主题数据django学习 初识Django1.安装django2.创建项目2.1 在终端2.2 Pycharm 3. 创建app4.快速上手4.1 再写一个页面4.2 templates模板4.3 静态文件4.3.1 static目录4.3.2 引用静态文件 5.模板语法案例#xff1a;伪联通新闻中心6.请求和响应案例#xff1a;用户登录7.数据库操作7.1… django学习 初识Django1.安装django2.创建项目2.1 在终端2.2 Pycharm 3. 创建app4.快速上手4.1 再写一个页面4.2 templates模板4.3 静态文件4.3.1 static目录4.3.2 引用静态文件 5.模板语法案例伪联通新闻中心6.请求和响应案例用户登录7.数据库操作7.1 安装第三方模块7.2 ORM1. 自己创建数据库2. django连接数据库3.django操作表4.表中的数据 案例用户管理1. 展示用户列表2.添加用户3.删除用户 Django开发一1.新建项目2.创建app3.设计表结构django4.在MySQL中生成表5.静态文件管理6.部门管理7.模板的继承8.用户管理8.1 初识Form1. views.py2.user_add.html 8.3 ModelForm推荐0. models.py1. views.py2.user_add.html Django开发二8.4 编辑用户8.5 删除 9.靓号管理9.1 表结构9.2 靓号列表9.3 新建靓号9.4 编辑靓号9.5 搜索手机号9.6 分页 10.时间插件11.ModelForm和BootStrap操作 Django开发三1.Ajax请求2.订单小结3.图表 Django开发四1.知识点复习1.1 基础入门1.2 数据类型1.3 函数1.4 模块1.5 面向对象1.6 MySQL数据库1.7 前端开发1.8 Django 2.关于文件上传2.1 基本操作案例批量上传数据案例混合数据Form2.2 启用media案例混合数据form案例混合数据ModalForm)models.py定义ModelForm视图 小结 总结 初识Django
Python知识点函数、面向对象。前端开发HTML、CSS、JavaScript、jQuery、BootStrap。MySQL数据库。Python的Web框架 Flask自身短小精悍 第三方组件。Django内部已集成了很多组件 第三方组件。【主要】
1.安装django
pip install djangoc:\python39- python.exe- Scripts- pip.exe- django-admin.exe 【工具创建django项目中的文件和文件夹】- Lib- 内置模块- site-packages- openpyxl- python-docx- flask- django 【框架的源码】2.创建项目 django中项目会有一些默认的文件和默认的文件夹。 2.1 在终端 打开终端。 进入某个目录项目放在哪里。 /Users/wupeiqi/PycharmProjects/gx执行命令创建项目 c:\python39\Scripts\django-admin.exe startproject 项目名称# 如果 c:\python39\Scripts 已加入环境系统环境变量。django-admin startproject 项目名称# 我自己的电脑
/Library/Frameworks/Python.framework/Versions/3.9/bin/django-admin startproject mysite[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g95O9Kfj-1690794616337)(assets/image-20211124085229322.png)]
2.2 Pycharm
注意
- Python解释器安装目录C:\python39\python.exe lib..../Library/Frameworks/Python.framework/Versions/3.9/- F:\pycode\ (基于Django创建的项目)/Users/wupeiqi/PycharmProjects[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UuMcjNLT-1690794616338)(assets/image-20211124090749083.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VyBLyXk9-1690794616338)(assets/image-20211124090818003.png)]
特殊说明 命令行创建的项目是标准的。 pycharm在标准的基础上默认给咱们加了点东西。 创建了一个templates目录【删除】 settings.py中【删除】 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dft4zbqz-1690794616339)(assets/image-20211124091443354.png)]
默认项目的文件介绍
mysite
├── manage.py 【项目的管理启动项目、创建app、数据管理】【不要动】【***常常用***】
└── mysite├── __init__.py├── settings.py 【项目配置】 【***常常修改***】├── urls.py 【URL和函数的对应关系】【***常常修改***】├── asgi.py 【接收网络请求】【不要动】└── wsgi.py 【接收网络请求】【不要动】3. 创建app
- 项目- app用户管理【表结构、函数、HTML模板、CSS】- app订单管理【表结构、函数、HTML模板、CSS】- app后台管理【表结构、函数、HTML模板、CSS】- app网站 【表结构、函数、HTML模板、CSS】- appAPI 【表结构、函数、HTML模板、CSS】..注意我们开发比较简洁用不到多app一般情况下项目下创建1个app即可。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vKyPqzgm-1690794616340)(assets/image-20211124094508905.png)]
├── app01
│ ├── __init__.py
│ ├── admin.py 【固定不用动】django默认提供了admin后台管理。
│ ├── apps.py 【固定不用动】app启动类
│ ├── migrations 【固定不用动】数据库变更记录
│ │ └── __init__.py
│ ├── models.py 【**重要**】对数据库操作。
│ ├── tests.py 【固定不用动】单元测试
│ └── views.py 【**重要**】函数。
├── manage.py
└── mysite2├── __init__.py├── asgi.py├── settings.py├── urls.py 【URL-函数】└── wsgi.py4.快速上手 确保app已注册 【settings.py】 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gKW2Umzj-1690794616340)(assets/image-20211124095619097.png)] 编写URL和视图函数对应关系 【urls.py】 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vT7Xxumk-1690794616341)(assets/image-20211124095850778.png)] 编写视图函数 【views.py】 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IqyFM6Bd-1690794616341)(assets/image-20211124100027337.png)] 启动django项目 命令行启动 python manage.py runserver Pycharm启动 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mt4BoYNP-1690794616342)(assets/image-20211124100320461.png)]
4.1 再写一个页面
- url - 函数
- 函数[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jHhyQD9f-1690794616342)(assets/image-20211124101708419.png)]
4.2 templates模板
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zScWppLG-1690794616342)(assets/image-20211124102815510.png)]
4.3 静态文件
在开发过程中一般将
图片CSSjs
都会当做静态文件处理。
4.3.1 static目录
在app目录下创建static文件夹。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-foitRgki-1690794616343)(assets/image-20211124103828667.png)]
4.3.2 引用静态文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fGwOHmCj-1690794616343)(assets/image-20211124103947169.png)]
5.模板语法
本质上在HTML中写一些占位符由数据对这些占位符进行替换和处理。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JwPcg4Ob-1690794616343)(assets/image-20211124113409740.png)]
案例伪联通新闻中心
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-35s5sJro-1690794616344)(assets/image-20211124115145293.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mBv931Sa-1690794616344)(assets/image-20211124115155394.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CaOfYvt9-1690794616344)(assets/image-20211124115209067.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-42DnrY5R-1690794616345)(assets/image-20211124115218937.png)]
6.请求和响应
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WK5oRO2G-1690794616345)(assets/image-20211124142250396.png)]
关于重定向
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tgHRG1oa-1690794616345)(assets/image-20211124142033257.png)]
案例用户登录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zlFmHVRB-1690794616346)(assets/image-20211124151119553.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pU24JgTm-1690794616346)(assets/image-20211124151127364.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SQE1ILmA-1690794616346)(assets/image-20211124151135563.png)]
7.数据库操作 MySQL数据库 pymysql import pymysql# 1.连接MySQL
conn pymysql.connect(host127.0.0.1, port3306, userroot, passwdroot123, charsetutf8, dbunicom)
cursor conn.cursor(cursorpymysql.cursors.DictCursor)# 2.发送指令
cursor.execute(insert into admin(username,password,mobile) values(wupeiqi,qwe123,15155555555))
conn.commit()# 3.关闭
cursor.close()
conn.close()Django开发操作数据库更简单内部提供了ORM框架。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tJYs4lPR-1690794616347)(assets/image-20211124151748712.png)]
7.1 安装第三方模块
pip install mysqlclient[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JbJLTE3e-1690794616347)(assets/image-20211124152339567.png)]
7.2 ORM
ORM可以帮助我们做两件事 创建、修改、删除数据库中的表不用你写SQL语句。 【无法创建数据库】 操作表中的数据不用写SQL语句。
1. 自己创建数据库 启动MySQL服务 自带工具创建数据库 create database gx_day15 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KrvrYMM0-1690794616347)(assets/image-20211124153042996.png)]
2. django连接数据库
在settings.py文件中进行配置和修改。
DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: gx_day15, # 数据库名字USER: root,PASSWORD: root123,HOST: 127.0.0.1, # 那台机器安装了MySQLPORT: 3306,}
}[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lRCwHknH-1690794616348)(assets/image-20211124154030823.png)]
3.django操作表
创建表删除表修改表
创建表在models.py文件中
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X78iOQAG-1690794616348)(assets/image-20211124154658774.png)]
create table app01_userinfo(id bigint auto_increment primary key,name varchar(32),password varchar(64),age int
)执行命令
python3.9 manage.py makemigrations
python3.9 manage.py migrate注意app需要提前注册。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-La5e9anw-1690794616349)(assets/image-20211124155407018.png)]
在表中新增列时由于已存在列中可能已有数据所以新增列必须要指定新增列对应的数据 1手动输入一个值。 设置默认值 age models.IntegerField(default2)允许为空 data models.IntegerField(nullTrue, blankTrue)以后在开发中如果想要对表结构进行调整 在models.py文件中操作类即可。 命令 python3.9 manage.py makemigrations
python3.9 manage.py migrate4.表中的数据 # #### 1.新建 ####
# Department.objects.create(title销售部)
# Department.objects.create(titleIT部)
# Department.objects.create(title运营部)
# UserInfo.objects.create(name武沛齐, password123, age19)
# UserInfo.objects.create(name朱虎飞, password666, age29)
# UserInfo.objects.create(name吴阳军, password666)# #### 2.删除 ####
# UserInfo.objects.filter(id3).delete()
# Department.objects.all().delete()# #### 3.获取数据 ####
# 3.1 获取符合条件的所有数据
# data_list [对象,对象,对象] QuerySet类型
# data_list UserInfo.objects.all()
# for obj in data_list:
# print(obj.id, obj.name, obj.password, obj.age)# data_list [对象,]
# data_list UserInfo.objects.filter(id1)
# print(data_list)
# 3.1 获取第一条数据【对象】
# row_obj UserInfo.objects.filter(id1).first()
# print(row_obj.id, row_obj.name, row_obj.password, row_obj.age)# #### 4.更新数据 ####
# UserInfo.objects.all().update(password999)
# UserInfo.objects.filter(id2).update(age999)
# UserInfo.objects.filter(name朱虎飞).update(age999)案例用户管理
1. 展示用户列表
url函数 获取所有用户信息HTML渲染
2.添加用户
url函数 GET看到页面输入内容。POST提交 - 写入到数据库。
3.删除用户
url函数
http://127.0.0.1:8000/info/delete/?nid1
http://127.0.0.1:8000/info/delete/?nid2
http://127.0.0.1:8000/info/delete/?nid3def 函数(request):nid reuqest.GET.get(nid)UserInfo.objects.filter(idnid).delete()return HttpResponse(删除成功)Django开发一
主题员工管理系统
1.新建项目
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WCXbc0sm-1690794616349)(E:\django\day15.assets\image-20211125083543235.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SuC8AlHQ-1690794616349)(E:\django\day15.assets\image-20211125083701911.png)]
2.创建app
python manage.py startapp app01[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9SBwoWDe-1690794616350)(E:\django\day15.assets\image-20211125084115717.png)]
注册app
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i34CygP6-1690794616350)(E:\django\day15.assets\image-20211125084246174.png)]
3.设计表结构django
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-URNp4SqY-1690794616350)(E:\django\day15.assets\image-20211125092320247.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kztMSnQ0-1690794616351)(E:\django\day15.assets\image-20211125092904544.png)]
from django.db import modelsclass Department(models.Model): 部门表 title models.CharField(verbose_name标题, max_length32)class UserInfo(models.Model): 员工表 name models.CharField(verbose_name姓名, max_length16)password models.CharField(verbose_name密码, max_length64)age models.IntegerField(verbose_name年龄)account models.DecimalField(verbose_name账户余额, max_digits10, decimal_places2, default0)create_time models.DateTimeField(verbose_name入职时间)# 无约束# depart_id models.BigIntegerField(verbose_name部门ID)# 1.有约束# - to与那张表关联# - to_field表中的那一列关联# 2.django自动# - 写的depart# - 生成数据列 depart_id# 3.部门表被删除# ### 3.1 级联删除depart models.ForeignKey(toDepartment, to_fieldid, on_deletemodels.CASCADE)# ### 3.2 置空# depart models.ForeignKey(toDepartment, to_fieldid, nullTrue, blankTrue, on_deletemodels.SET_NULL)# 在django中做的约束gender_choices ((1, 男),(2, 女),)gender models.SmallIntegerField(verbose_name性别, choicesgender_choices)4.在MySQL中生成表 工具连接MySQL生成数据库。 create database gx_day16 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;修改配置文件连接MySQL DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: gx_day16, # 数据库名字USER: root,PASSWORD: root123,HOST: 127.0.0.1, # 那台机器安装了MySQLPORT: 3306,}
}[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LEIeauus-1690794616351)(E:\django\day15.assets\image-20211125093556582.png)] django命令生成数据库表 python manage.py makemigrations
python manage.py migrate[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HxSGeTHd-1690794616351)(E:\django\day15.assets\image-20211125093805549.png)]
表结构创建成功
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KXnfuumV-1690794616352)(E:\django\day15.assets\image-20211125093859327.png)]
5.静态文件管理
static目录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RA2prnAB-1690794616352)(E:\django\day15.assets\image-20211125095750076.png)]
6.部门管理 体验最原始方法来做。 Django中提供Form和ModelForm组件方便 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9BHHWnAm-1690794616352)(E:\django\day15.assets\image-20211125100519237.png)]
7.模板的继承
部门列表添加部门编辑部门
定义目版layout.html
!DOCTYPE html
html langen
headmeta charsetUTF-8titleTitle/titlelink relstylesheet href{% static plugin...min.css %}{% block css %}{% endblock %}
/head
bodyh1标题/h1div{% block content %}{% endblock %}/divh1底部/h1script src{% static js/jquery-3.6.0.min.js %}/script{% block js %}{% endblock %}
/body
/html
继承母版
{% extends layout.html %}{% block css %}link relstylesheet href{% static pluxxx.css %}style.../style
{% endblock %}{% block content %}h1首页/h1
{% endblock %}{% block js %}script src{% static js/jqxxxin.js %}/script
{% endblock %}8.用户管理
insert into app01_userinfo(name,password,age,account,create_time,gender,depart_id) values(韩超,666,23,100.68,2020-01-11,2,1);insert into app01_userinfo(name,password,age,account,create_time,gender,depart_id) values(刘东,123,23,100.68,2010-11-11,1,4);insert into app01_userinfo(name,password,age,account,create_time,gender,depart_id) values(朱虎飞,999,33,9900.68,2021-05-11,1,1);----------------------------------------------------------------
| Field | Type | Null | Key | Default | Extra |
----------------------------------------------------------------
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| name | varchar(16) | NO | | NULL | |
| password | varchar(64) | NO | | NULL | |
| age | int(11) | NO | | NULL | |
| account | decimal(10,2) | NO | | NULL | |
| create_time | datetime(6) | NO | | NULL | |
| gender | smallint(6) | NO | | NULL | |
| depart_id | bigint(20) | NO | MUL | NULL | |
----------------------------------------------------------------[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HO5efwGQ-1690794616353)(E:\django\day15.assets\image-20211125144436879.png)]
新建用户 原始方式理思路不会采用本质【麻烦】 - 用户提交数据没有校验。
- 错误页面上应该有错误提示。
- 页面上没一个字段都需要我们重新写一遍。 [OK]
- 关联的数据手动去获取并展示循环展示在页面。 [OK]Django组件 Form组件小简便ModelForm组件最简便
8.1 初识Form
1. views.py
class MyForm(Form):user forms.CharField(widgetforms.Input)pwd form.CharFiled(widgetforms.Input)email form.CharFiled(widgetforms.Input)account form.CharFiled(widgetforms.Input)create_time form.CharFiled(widgetforms.Input)depart form.CharFiled(widgetforms.Input)gender form.CharFiled(widgetforms.Input)def user_add(request):if request.method GET:form MyForm()return render(request, user_add.html,{form:form})2.user_add.html
form methodpost{% for field in form%}{{ field }}{% endfor %}!-- input typetext placeholder姓名 nameuser / --
/formform methodpost{{ form.user }}{{ form.pwd }}{{ form.email }}!-- input typetext placeholder姓名 nameuser / --
/form8.3 ModelForm推荐
0. models.py
class UserInfo(models.Model): 员工表 name models.CharField(verbose_name姓名, max_length16)password models.CharField(verbose_name密码, max_length64)age models.IntegerField(verbose_name年龄)account models.DecimalField(verbose_name账户余额, max_digits10, decimal_places2, default0)create_time models.DateTimeField(verbose_name入职时间)depart models.ForeignKey(toDepartment, to_fieldid, on_deletemodels.CASCADE)gender_choices ((1, 男),(2, 女),)gender models.SmallIntegerField(verbose_name性别, choicesgender_choices)1. views.py
class MyForm(ModelForm):xx form.CharField*(...)class Meta:model UserInfofields [name,password,age,xx]def user_add(request):if request.method GET:form MyForm()return render(request, user_add.html,{form:form})2.user_add.html
form methodpost{% for field in form%}{{ field }}{% endfor %}!-- input typetext placeholder姓名 nameuser / --
/formform methodpost{{ form.user }}{{ form.pwd }}{{ form.email }}!-- input typetext placeholder姓名 nameuser / --
/formDjango开发二 部门管理 用户管理 用户列表 新建用户 - ModelForm针对数据库中的某个表。
- Form。8.4 编辑用户 点击编辑跳转到编辑页面将编辑行的ID携带过去。 编辑页面默认数据根据ID获取并设置到页面中 提交 错误提示 数据校验 在数据库更新 models.UserInfo.filter(id4).update(...)8.5 删除
见代码。
9.靓号管理
9.1 表结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NuYRP5xz-1690794616353)(E:\django\day15.assets\image-20211126094318872.png)]
根据表结构的需求在models.py中创建类由类生成数据库中的表。
class PrettyNum(models.Model): 靓号表 mobile models.CharField(verbose_name手机号, max_length11)# 想要允许为空 nullTrue, blankTrueprice models.IntegerField(verbose_name价格, default0)level_choices ((1, 1级),(2, 2级),(3, 3级),(4, 4级),)level models.SmallIntegerField(verbose_name级别, choiceslevel_choices, default1)status_choices ((1, 已占用),(2, 未使用))status models.SmallIntegerField(verbose_name状态, choicesstatus_choices, default2)自己在数据模拟创建一些数据
insert into app01_prettynum(mobile,price,level,status)values(111111111,19,1,1);mysql select * from app01_prettynum;
-------------------------------------
| id | mobile | price | level | status |
-------------------------------------
| 1 | 111111111 | 19 | 1 | 1 |
| 2 | 111111111 | 19 | 1 | 1 |
| 3 | 111111111 | 19 | 1 | 1 |
| 4 | 111111111 | 19 | 1 | 1 |
-------------------------------------
4 rows in set (0.01 sec)9.2 靓号列表 URL 函数 获取所有的靓号 结合htmlrender将靓号罗列出来 id 号码 价格 级别中文 状态中文9.3 新建靓号 列表点击跳转/pretty/add/ URL ModelForm类 from django import formsclass PrettyModelForm(forms.ModelForm):...函数 实例化类的对象通过render将对象传入到HTML中。模板的循环展示所有的字段。 点击提交 数据校验保存到数据库跳转回靓号列表
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iBAgglFl-1690794616353)(E:\django\day15.assets\image-20211126111252278.png)]
9.4 编辑靓号
列表页面/pretty/数字/edit/URL函数 根据ID获取当前编辑的对象ModelForm配合默认显示数据。提交修改。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lsJ9Gpxx-1690794616354)(E:\django\day15.assets\image-20211126112848435.png)]
不允许手机号重复。 添加【正则表达式】【手机号不能存在】 # [obj,obj,obj]
queryset models.PrettyNum.objects.filter(mobile1888888888)obj models.PrettyNum.objects.filter(mobile1888888888).first()# True/False
exists models.PrettyNum.objects.filter(mobile1888888888).exists()编辑【正则表达式】【手机号不能存在】 排除自己以外其他的数据是否手机号是否重复# id!2 and mobile1888888888
models.PrettyNum.objects.filter(mobile1888888888).exclude(id2)9.5 搜索手机号
models.PrettyNum.objects.filter(mobile19999999991,id12)data_dict {mobile:19999999991,id:123}
models.PrettyNum.objects.filter(**data_dict)models.PrettyNum.objects.filter(id12) # 等于12
models.PrettyNum.objects.filter(id__gt12) # 大于12
models.PrettyNum.objects.filter(id__gte12) # 大于等于12
models.PrettyNum.objects.filter(id__lt12) # 小于12
models.PrettyNum.objects.filter(id__lte12) # 小于等于12data_dict {id__lte:12}
models.PrettyNum.objects.filter(**data_dict)models.PrettyNum.objects.filter(mobile999) # 等于
models.PrettyNum.objects.filter(mobile__startswith1999) # 筛选出以1999开头
models.PrettyNum.objects.filter(mobile__endswith999) # 筛选出以999结尾
models.PrettyNum.objects.filter(mobile__contains999) # 筛选出包含999data_dict {mobile__contains:999}
models.PrettyNum.objects.filter(**data_dict)9.6 分页
queryset models.PrettyNum.objects.all()queryset models.PrettyNum.objects.filter(id1)[0:10]# 第1页
queryset models.PrettyNum.objects.all()[0:10]# 第2页
queryset models.PrettyNum.objects.all()[10:20]# 第3页
queryset models.PrettyNum.objects.all()[20:30]data models.PrettyNum.objects.all().count()
data models.PrettyNum.objects.filter(id1).count()分页的逻辑和处理规则 封装分页类 从头到尾开发写项目用【pagination.py】公共组件。 小Bug搜索 分页情况下。 分页时候保留原来的搜索条件http://127.0.0.1:8000/pretty/list/?q888
http://127.0.0.1:8000/pretty/list/?page1http://127.0.0.1:8000/pretty/list/?q888page2310.时间插件
link relstylesheet hrefstatic/plugins/bootstrap-3.4.1/css/bootstrap.css
link relstylesheet hrefstatic/plugins/bootstrap-datepicker/css/bootstrap-datepicker.cssinput typetext iddt classform-control placeholder入职日期script srcstatic/js/jquery-3.6.0.min.js/script
script srcstatic/plugins/bootstrap-3.4.1/js/bootstrap.js/script
script srcstatic/plugins/bootstrap-datepicker/js/bootstrap-datepicker.js/script
script srcstatic/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.zh-CN.min.js/scriptscript$(function () {$(#dt).datepicker({format: yyyy-mm-dd,startDate: 0,language: zh-CN,autoclose: true});})
/script11.ModelForm和BootStrap ModelForm可以帮助我们生成HTML标签。 class UserModelForm(forms.ModelForm):class Meta:model models.UserInfofields [name, password,]form UserModelForm(){{form.name}} 普通的input框
{{form.password}} 普通的input框定义插件 class UserModelForm(forms.ModelForm):class Meta:model models.UserInfofields [name, password,]widgets {name: forms.TextInput(attrs{class: form-control}),password: forms.PasswordInput(attrs{class: form-control}),age: forms.TextInput(attrs{class: form-control}),}class UserModelForm(forms.ModelForm):name forms.CharField(min_length3,label用户名,widgetforms.TextInput(attrs{class: form-control}))class Meta:model models.UserInfofields [name, password, age]{{form.name}} BootStrap的input框
{{form.password}} BootStrap的input框重新定义的init方法批量设置 class UserModelForm(forms.ModelForm):class Meta:model models.UserInfofields [name, password, age,]def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# 循环ModelForm中的所有字段给每个字段的插件设置for name, field in self.fields.items():field.widget.attrs {class: form-control, placeholder: field.label}class UserModelForm(forms.ModelForm):class Meta:model models.UserInfofields [name, password, age,]def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# 循环ModelForm中的所有字段给每个字段的插件设置for name, field in self.fields.items():# 字段中有属性保留原来的属性没有属性才增加。if field.widget.attrs:field.widget.attrs[class] form-controlfield.widget.attrs[placeholder] field.labelelse:field.widget.attrs {class: form-control, placeholder: field.label}class UserEditModelForm(forms.ModelForm):class Meta:model models.UserInfofields [name, password, age,]def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# 循环ModelForm中的所有字段给每个字段的插件设置for name, field in self.fields.items():# 字段中有属性保留原来的属性没有属性才增加。if field.widget.attrs:field.widget.attrs[class] form-controlfield.widget.attrs[placeholder] field.labelelse:field.widget.attrs {class: form-control, placeholder: field.label}自定义类 class BootStrapModelForm(forms.ModelForm):def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# 循环ModelForm中的所有字段给每个字段的插件设置for name, field in self.fields.items():# 字段中有属性保留原来的属性没有属性才增加。if field.widget.attrs:field.widget.attrs[class] form-controlfield.widget.attrs[placeholder] field.labelelse:field.widget.attrs {class: form-control, placeholder: field.label}class UserEditModelForm(BootStrapModelForm):class Meta:model models.UserInfofields [name, password, age,]操作 提取公共的类 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TajQ5Ki0-1690794616354)(E:\django\day15.assets\image-20211126175803303.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BK4Gnv1I-1690794616354)(E:\django\day15.assets\image-20211126175826579.png)] ModelForm拆分出来 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A82Ti9tw-1690794616355)(E:\django\day15.assets\image-20211126175852716.png)] 视图函数的归类 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4lh1fBWi-1690794616355)(E:\django\day15.assets\image-20211126175927378.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7NqtwfX2-1690794616355)(E:\django\day15.assets\image-20211126175946996.png)]
Django开发三
知识点的回顾 安装Django pip install django创建Django项目 django-admin startproject mysite注意Pycharm可以创建。如果用Pycharm创建记得settings.py中的DIR templates 删除。 创建app 注册 python manage.py startapp app01
python manage.py startapp app02
python manage.py startapp app03INSTALLED_APPS [...app01.apps.App01Config
]注意否则app下的models.py写类时无法在数据库中创建表。 配置 静态文件路径 模板的路径放在app目录下。 配置数据库相关操作MySQL 第三方模块django3版本 pip install mysqlclient自己先去MySQL创建一个数据库。 配置数据库连接settings.py DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: gx_day16, # 数据库名字USER: root,PASSWORD: root123,HOST: 127.0.0.1, # 那台机器安装了MySQLPORT: 3306,}
}在app下的models.py中编写 from django.db import modelsclass Admin(models.Model): 管理员 username models.CharField(verbose_name用户名, max_length32)password models.CharField(verbose_name密码, max_length64)def __str__(self):return self.usernameclass Department(models.Model): 部门表 title models.CharField(verbose_name标题, max_length32)def __str__(self):return self.title执行两个命令 python manange.py makemigrations
python manange.py migrate在 urls.py 路由 URL 和 函数的对应关系。 在views.py视图函数编写业务逻辑。 templates目录编写HTML模板含有模板语法、继承、{% static xx%} ModelForm Form组件在我们开发增删改查功能。 生成HTML标签生成默认值请求数据进行校验。保存到数据库ModelForm获取错误信息。 Cookie和Session用户登录信息保存起来。 中间件基于中间件实现用户认证 基于process_request。 ORM操作 models.User.objects.filter(idxxx)
models.User.objects.filter(idxxx).order_by(-id)分页组件。
1.Ajax请求
2.订单
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mOa4MvUm-1690794616356)(E:\django\day15.assets\image-20211129092011994.png)]
class Order(models.Model): 订单 oid models.CharField(verbose_name订单号, max_length64)title models.CharField(verbose_name名称, max_length32)price models.IntegerField(verbose_name价格)status_choices ((1, 待支付),(2, 已支付),)status models.SmallIntegerField(verbose_name状态, choicesstatus_choices, default1)admin models.ForeignKey(verbose_name管理员, toAdmin, on_deletemodels.CASCADE)想要去数据库中获取数据时对象/字典
# 对象当前行的所有数据。
row_object models.Order.objects.filter(iduid).first()
row_object.id
row_object.title# 字典{id:1,title:xx}
row_dict models.Order.objects.filter(iduid).values(id,title).first()# queryset [obj,obj,obj,]
queryset models.Order.objects.all()# queryset [ {id:1,title:xx},{id:2,title:xx}, ]
queryset models.Order.objects.all().values(id,title)# queryset [ (1,xx),(2,xxx), ]
queryset models.Order.objects.all().values_list(id,title)小结
至此基于Ajax 对话框的形式实现的页面的增删改查。
表单实现增删改查。Ajax实现增删改查。
3.图表
highchart国外。echarts国内。
更多参考文档https://echarts.apache.org/handbook/zh/get-started
Django开发四
1.知识点复习
1.1 基础入门 编码 编码基础知识点utf-8、unicode、gbk、ascii
默认解释器编码- Python2ascii # -*- coding:utf-8 -*- )- Python3utf-8重要输入和输出 print
input用户输入的永远是字符串类型。data input(请输入序号) # 1
print(data) # 1变量 规范字母、数字、下划线数字不能开头不能是py内置关键字。
建议- 见名知意- 多个单词用下划线连接。- 全局变量用大写 DATA_LIST、USER_INFO 局部变量小写user_age。注意全局变量 GET_INFO局部变量 get_info函数名 get_info类名 GetInfo文件名 get_info包名称 get_info异常处理【补充】 data input(请输入) # 你好
res int(data)
print(res)# 这个代码是有风险可能会报错。print(开始)
try:data input(请输入) # 123 / 你好res int(data)print(res)
except Exception as e:print(出错了)print(结束)循环中for/while内部都可以用 break、continue 字符串格式化 data 我是{}姓名是{}年龄是{}.format(xx,123,999)data 我是{0}姓名是{1}年龄是{2}.format(xx,123,999)data 我是{0}姓名是{0}年龄是{2}.format(xx,123)运算符 - 传统的运算符
- 逻辑运算符- 常见操作最终的到的结果True/Falseif 110 and 98:passelse:pass- 非传统最终的结果是第一个或第二个值。data 值1 and 值2v1 5 and 9 # 9v2 0 and 10 # 01.2 数据类型 字符串类型 - 不可变类型
- 常见方法strip/split/replace/joinv1 rootdata v1.upper()print(v1) # rootprint(data) # ROOT- 公共索引、切片、循环v1 rootv1[1] X # 报错不可变列表类型 - 可变类型
- 常见方法append/insert/pop/remove
- 公共索引、切片、循环v1 [11,22,33,44,55]v1[0]v1[1:3] - 前取后不取v1[1:-1]
- 列表的推导式data [ i for i in range(10)]data [ i for i in range(10) if i5]字典类型 - 可变类型
- 字典的键是有要求可哈希类型目前不可哈希list/dict/set。
- 扩展python3.6字典有序。
- 常见的功能keys、values、items、getdata {}v1 data.get(k1)关于元组 v1 (11,)
v2 (11) # 11
v3 11其他数据类型 其他类型转布尔类型时哪些为False 空、0、None
其他类型转自己类型时自己的类名()int(123)1.3 函数 定义 def func():passfunc()参数 def func(v1,v2):passdef func(v1, v2None):passdef func(*args,**kwargs):pass返回值 - 没有返回值默认返回Nonedef func(v1,v2):print(999)
- 一个返回值def func(v1,v2):return 123res func(1,2)print(res) # 123- 多个返回值def func(v1,v2):return 123,999,123res func(1,2)print(res) # (123,999,123)def func(v1,v2):return 123,999,123d1,d2,c3 func(1,2)v1,v2 [11,22]
v1,v2,v3 (11,22,999)lambda表达式匿名函数 def func(arg):return arg 100func lambda arg:arg100
v1 func(100)
print(v1) # 200内置函数 max/min/all/any/help/hex/oct/bin..open文件操作。f open(xx.log,moder)data f.read()f.close()文件操作 - 模式r/w/a rb/wb/ab
- 打开 关闭with open(xx.log,moder) as f:f.read()1.4 模块 分类 - 自定义模块自己写文件/文件夹
- 内置模块time/datetime/json/hashlib/random/re等
- 第三方模块openpyxl/requests/bs4/flask/django等自定义模块 - sys.pathPython内部导入模块时根据目录去寻找。
- 一定不要让自己写的模块名和内置的模块名重复***
- 导入模块import xxxfrom xxx import xxx内置模块 - 时间部分time/datetime/字符串类型。
- random随机生成数字。
- hashlib加密md5加密、md5加密加盐 防止被撞库。
- json- JSON格式的字符串 内部字符串双引号、内部[] - json.dumps- json.loads
- re和正则- 正则\d \w ; 贪婪匹配。- re.search/re.match/ re.findall第三方模块 - 安装第三方模块pip、源码、wheel
- 常见第三方模块- requests- bs4- openpyxl- python-docx- flask/django flask简洁轻量级django功能强大1.5 面向对象
- 面向对象的三大特性封装、继承、多态。
- 理解读懂源码和代码。1.6 MySQL数据库
- 数据库
- 表
- 数据行
更多知识https://www.bilibili.com/video/BV15R4y1b7y9show databases;
use 数据库;show tables;
desc 表名;select * from 表;
insert into 表(列,列,列)values(...)
update 表 set 列值;
delete from 表 where 条件;Python连接并操作MySQL pymysql 【自己原生写】 pip install pymysqlmysqlclient 【django内部】 pip install mysqlclientMySQLdb 默认不支持python3 pip intall MySQLdb当使用Python代码去操作MySQL时一定要防止SQL注入的问题。
# SQL语句不要用字符串格式化去拼接。import pymysql
# 1.连接MySQL
conn pymysql.connect(host127.0.0.1, port3306, userroot, passwdroot123, charsetutf8, dbunicom)
cursor conn.cursor(cursorpymysql.cursors.DictCursor)# 【错误】不要这么写
sql select * from admin where id %s.format(2)
cursor.execute(sql)
# 【正确】这么写
cursor.execute(select * from admin where id %s, [2, ])# 获取符合条件的第一条数据字典 None
res cursor.fetchone()
print(res) # {id: 3, username: 集宁, password: qwe123, mobile: 1999999999}# 3.关闭连接
cursor.close()
conn.close()1.7 前端开发 HTML - 块级和行内标签div、span块级div/h系列行内span/a 设置高度、宽度、边距无效
- Form表单form methodpost action地址 input ....input typesubmit ... //form- 关于a标签a hrefwww.baidu.com百度/a 超链接去跳转。做锚点a href#m1第一章/aa href#m2第二章/adiv idm1 styleheight: 1000px;第一章 谢新雪/divdiv idm2 styleheight: 1000px;第二章 单独的/divCSS - 位置- 标签 div stylexxx- style代码块stylediv { }#v1 { }.v2 {}/style- 文件中- 选择器div { }#v1 { }.v2 { }div[xx11] { }- 样式color;fonts-ize; background-color; padding; margin;float:left; ,脱离文档流。 clear:both; :afterJavaScript jQuery - 本质上找到标签操作标签。- 找标签$(#x1)$(.x1)$(div)$(input[typetext]) 找到 input 标签且 typetext
- 操作标签$(#x1).text() div idx1dd/div$(#x1).text(xxx) div idx1xxx/div$(#x1).val() input idx1 /$(#x1).val(xxx) input idx1 /$(#x1).attr(uu) div idx1 uu123dd/div$(#x1).attr(uu,999) div idx1 uu999dd/div$(#x1).empty() div idx1dd/div - 清空内容$(#x1).remove() div idx1dd/div - 整个标签删除BootStrap - 支持响应式布局根据屏幕的宽度调整布局。
- 栅格12份。
- 常见的样式- container / container-fluid- 面板- 按钮- 表单- 表格- 对话框第三方插件 - 插件一般都包含CSS、JavaScript开发使用时候- 引入css、js依赖jQuery- 使用关于注释 - Python语言# 注释 注释
- HTML!-- --- CSS注释/* 注释 */- JavaScript// 注释/* 注释 */1.8 Django 安装 pip install djangopython安装目录下- lib/site-packages/django源码包- Scripts/django-admin.exe 文件创建Django项目 django-admin startproject 项目名创建APP cd 项目目录
python manange.py startapp app名称注册app - 不注册models.py生成数据库表行为不执行。
- 不注册模板文件、静态文件不回去app目录下找。static目录静态文件目录 templates目录模板文件目录HTML 表结构设计 app01/modes.py下执行 from django.db import modelsclass UserInfo(models.Model):v1 models.CharField(max_length32).....python manage.py makemigrations
python manage.py migrateurls.py 中编写路由。 from django.urls import path,re_path
from app01 import adminurlpatterns [path(admin/list/, admin.admin_list),path(admin/int:nid/delete/, admin.admin_delete),re_path(admin/(?Pnid\d)/delete/, admin.admin_delete)
]视图函数 def admin_list(request):k1 request.POST.get(k1)... 业务处理return 数据- 默认参数request包含请求相关的所有数据。request.methodrequest.GETrequest.POSTrequest.FILES上传文件。request.path_info获取当前请求的URLhttp://127.0.0.1:8000/depart/add/ - /depart/add/- 返回值return HttpResponse(字符串)return JSONResponse( {status:123,data:[456,55,66,22,]} )return JSONResponse( [11,22,33,44] ,safeFalse)return render(request,xxx.html,{值})return redirect(http://127.0.0.1:8000/depart/add/)return redirect(/depart/add/)数据库的ORM操作 # 增加
models.类.objects.create(name武沛齐,age19)
models.类.objects.create(**{name:武沛齐,age:19})obj models.类(name武沛齐,age19)
obj.save()obj_list [models.类(name武沛齐,age19),models.类(name武沛齐,age19),models.类(name武沛齐,age19),models.类(name武沛齐,age19),models.类(name武沛齐,age19)。。。
]
models.类.objects.bulk_create(obj_list,batch_size10)# 查询
queyrset models.类.objects.filter(name武沛齐,age19) # [obj,obj,]
queyrset models.类.objects.filter(**{name:武沛齐,age:19}) # []
obj models.类.objects.filter(name武沛齐,age19).first() # obj / Nonequeyrset models.类.objects.filter(age19)
queyrset models.类.objects.filter(age__gt19)
queyrset models.类.objects.filter(age__gte19)
queyrset models.类.objects.filter(age__lt19)
queyrset models.类.objects.filter(age__lte19)
queyrset models.类.objects.filter(age__gt19, name武沛齐)
queyrset models.类.objects.filter(name__contains中国)
queyrset models.类.objects.exclude(id9) # id !9queyrset models.类.objects.filter(age19).order_by(id)
queyrset models.类.objects.filter(age19).order_by(-id)
queyrset models.类.objects.filter(age19).order_by(-id,name)queyrset models.类.objects.filter(age19)[0:10]# 更新
queyrset models.类.objects.filter(id2).update(age19,name武沛齐)
queyrset models.类.objects.filter(id2).update(**{name:武沛齐,age:19})obj models.类.objects.filter(id2).first()
obj.name 武沛齐
obj.age 19
obj.save()# 删除
models.类.objects.filter(id2).delete()整理的所有ORM操作https://www.cnblogs.com/wupeiqi/articles/6216618.htmlForm和ModelForm组件 - 自动生成HTML标签
- 对用户请求的数据进行校验- 自动保存到数据库ModelForm
- 错误信息from django import formsclass UserForm(forms.Form):xx forms.CharField(...)class UserModelForm(forms.ModelForm):class Meta:model models.类fields __all__ form UserModelForm(datarequest.POST,instance对象)
if form.is_valid():form.cleaned_data
else:form.errors关于POST提交CSRF认证 form methodpost{% csrf_token %}...
/form如果想要免除csrf认证。 from django.views.decorators.csrf import csrf_exemptcsrf_exempt
def order_add(request):passCookie和Session cookie本质上保存在浏览器端的键值对。
session保存服务器端django是将session默认存储在数据库中def order_add(request):request.session[xx] 123def logout(request):request.session.clear()中间件 - 类 process_request / process_response
- 注册中间件类MIDDLEWARE [django.middleware.security.SecurityMiddleware,django.contrib.sessions.middleware.SessionMiddleware,django.middleware.common.CommonMiddleware,django.middleware.csrf.CsrfViewMiddleware,django.contrib.auth.middleware.AuthenticationMiddleware,django.contrib.messages.middleware.MessageMiddleware,django.middleware.clickjacking.XFrameOptionsMiddleware,app01.middleware.auth.AuthMiddleware,]
- django请求到达之后自动会执行相应的方法。- process_request- 没有返回值或返回None继续向后执行。- 返回redirect/render/HttpResponse/JsonReponse拦截请求不再继续向后之后。图片验证码 pip install pillow- 创建图片并在图片上写文字
- 字体文件
- 自定义模块 check_code分页组件 开发时候会用。2.关于文件上传
2.1 基本操作
form methodpost enctypemultipart/form-data{% csrf_token %}input typetext nameusernameinput typefile nameavatarinput typesubmit value提交
/formfrom django.shortcuts import render, HttpResponsedef upload_list(request):if request.method GET:return render(request, upload_list.html)# # username: [big666]# print(request.POST) # 请求体中数据# # {avatar: [InMemoryUploadedFile: 图片 1.png (image/png)]}# print(request.FILES) # 请求发过来的文件 {}file_object request.FILES.get(avatar)# print(file_object.name) # 文件名WX20211117-2220412x.pngf open(file_object.name, modewb)for chunk in file_object.chunks():f.write(chunk)f.close()return HttpResponse(...)案例批量上传数据
form methodpost enctypemultipart/form-data action/depart/multi/{% csrf_token %}div classform-groupinput typefile nameexc/divinput typesubmit value上传 classbtn btn-info btn-sm
/formdef depart_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_row2):text row[0].valueexists models.Department.objects.filter(titletext).exists()if not exists:models.Department.objects.create(titletext)return redirect(/depart/list/)案例混合数据Form
提交页面时用户输入数据 文件输入不能为空、报错。
Form生成HTML标签typefile表单的验证form.cleaned_data 获取 数据 文件对象
{% extends layout.html %}{% block content %}div classcontainerdiv classpanel panel-defaultdiv classpanel-headingh3 classpanel-title {{ title }} /h3/divdiv classpanel-bodyform methodpost enctypemultipart/form-data novalidate {% csrf_token %}{% for field in form %}div classform-grouplabel{{ field.label }}/label{{ field }}span stylecolor: red;{{ field.errors.0 }}/span/div{% endfor %}button typesubmit classbtn btn-primary提 交/button/form/div/div/div{% endblock %}
from django import forms
from app01.utils.bootstrap import BootStrapFormclass UpForm(BootStrapForm):bootstrap_exclude_fields [img]name forms.CharField(label姓名)age forms.IntegerField(label年龄)img forms.FileField(label头像)def upload_form(request):title Form上传if request.method GET:form UpForm()return render(request, upload_form.html, {form: form, title: title})form UpForm(datarequest.POST, filesrequest.FILES)if form.is_valid():# {name: 武沛齐, age: 123, img: InMemoryUploadedFile: 图片 1.png (image/png)}# 1.读取图片内容写入到文件夹中并获取文件的路径。image_object form.cleaned_data.get(img)# file_path app01/static/img/{}.format(image_object.name)db_file_path os.path.join(static, img, image_object.name)file_path os.path.join(app01, db_file_path)f open(file_path, modewb)for chunk in image_object.chunks():f.write(chunk)f.close()# 2.将图片文件路径写入到数据库models.Boss.objects.create(nameform.cleaned_data[name],ageform.cleaned_data[age],imgdb_file_path,)return HttpResponse(...)return render(request, upload_form.html, {form: form, title: title})
注意就目前而言所有的静态文件都只能放在static目录。
在django的开发过程中两个特殊的文件夹
static存放静态文件的路径包括CSS、JS、项目图片。media用户上传的数据的目录。
2.2 启用media
在urls.py中进行配置
from django.urls import path, re_path
from django.views.static import serve
from django.conf import settingsurlpatterns [re_path(r^media/(?Ppath.*)$, serve, {document_root: settings.MEDIA_ROOT}, namemedia),
]在settings.py中进行配置
import osMEDIA_ROOT os.path.join(BASE_DIR, media)
MEDIA_URL /media/在浏览器上访问这个地址
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KwRwSO5N-1690794616357)(E:\django\day15.assets\image-20211130170639048.png)]
案例混合数据form
from django import forms
from app01.utils.bootstrap import BootStrapFormclass UpForm(BootStrapForm):bootstrap_exclude_fields [img]name forms.CharField(label姓名)age forms.IntegerField(label年龄)img forms.FileField(label头像)def upload_form(request):title Form上传if request.method GET:form UpForm()return render(request, upload_form.html, {form: form, title: title})form UpForm(datarequest.POST, filesrequest.FILES)if form.is_valid():# {name: 武沛齐, age: 123, img: InMemoryUploadedFile: 图片 1.png (image/png)}# 1.读取图片内容写入到文件夹中并获取文件的路径。image_object form.cleaned_data.get(img)# media_path os.path.join(settings.MEDIA_ROOT, image_object.name)media_path os.path.join(media, image_object.name)f open(media_path, modewb)for chunk in image_object.chunks():f.write(chunk)f.close()# 2.将图片文件路径写入到数据库models.Boss.objects.create(nameform.cleaned_data[name],ageform.cleaned_data[age],imgmedia_path,)return HttpResponse(...)return render(request, upload_form.html, {form: form, title: title})案例混合数据ModalForm)
models.py
class City(models.Model): 城市 name models.CharField(verbose_name名称, max_length32)count models.IntegerField(verbose_name人口)# 本质上数据库也是CharField自动保存数据。img models.FileField(verbose_nameLogo, max_length128, upload_tocity/)定义ModelForm
from app01.utils.bootstrap import BootStrapModelFormclass UpModelForm(BootStrapModelForm):bootstrap_exclude_fields [img]class Meta:model models.Cityfields __all__视图
def upload_modal_form(request): 上传文件和数据modelFormtitle ModelForm上传文件if request.method GET:form UpModelForm()return render(request, upload_form.html, {form: form, title: title})form UpModelForm(datarequest.POST, filesrequest.FILES)if form.is_valid():# 对于文件自动保存# 字段 上传路径写入到数据库form.save()return HttpResponse(成功)return render(request, upload_form.html, {form: form, title: title})小结 自己手动去写 file_object request.FILES.get(exc)
...Form组件表单验证 request.POST
file_object request.FILES.get(exc)具体文件操作还是手动自己做。ModelForm表单验证 自动保存数据库 自动保存文件 - Media文件夹
- Models.py定义类文件要img models.FileField(verbose_nameLogo, max_length128, upload_tocity/)总结
关于django的开发知识点更多的案例 Python基础课件 https://gitee.com/wupeiqi/python_course https://www.bilibili.com/video/BV1m54y1r7zE并发编程进程线程协程 https://www.bilibili.com/video/BV1Ev411G7i3?spm_id_from333.999.0.0# 不建议小白学协程
https://www.bilibili.com/video/BV1NA411g7yf?spm_id_from333.999.0.0MySQL数据库 # 2021最新推荐
https://www.bilibili.com/video/BV15R4y1b7y9?spm_id_from333.999.0.0# 2017年
https://www.bilibili.com/video/BV1DE411n7fU?前端开发 https://www.bilibili.com/video/BV1QE411j7bV?spm_id_from333.999.0.0django开发知识点 https://www.bilibili.com/video/BV1zE411x7LG
https://www.bilibili.com/video/BV1JE411V7xk项目开发 任务管理平台https://www.bilibili.com/video/BV1uA411b77M进阶项目增删改查、权限 https://space.bilibili.com/283478842/channel/detail?cid91596ctype0前后端分离的项目 django drf框架 vue.js - Django
- drf框架- https://www.bilibili.com/video/BV1ZE411j7RKgit 版本控制和协同开发 任务管理平台 https://www.bilibili.com/video/BV19E411f76x?spm_id_from333.999.0.0微信小程序 Django drf框架编写 https://www.bilibili.com/video/BV1jC4y1s7QD?spm_id_from333.999.0.0