PythonWeb Django框架学习笔记

news2024/9/24 5:31:01

文章目录

  • Django
  • 一、初步了解Django
    • 1.1 创建项目
    • 1.2 文件介绍
    • 1.3 APP的创建和说明
      • 添加新的app
      • 注册app
      • 创建页面
    • 1.4 templates模板
      • templates语法
        • 单一变量
        • 列表
        • 循环【列表】
        • 字典
        • 循环【字典】
        • 列表套字典
        • 条件判断
      • templates小结
    • 1.5 请求和响应
      • 案例:用户管理
  • 二、数据库操作
    • 2.1 ORM
    • 2.2 Django连接数据库
    • 2.3 Django操作表
    • 2.4 创建和修改表
        • 2.5 增删改查

Django

b站视频:最新Python的web开发全家桶(django+前端+数据库)

一、初步了解Django

1.1 创建项目

  • 命令行
  • Pycharm创建项目
    • 在标准的基础上默认给我们增加了点东西
    • 创建了一个templates目录(删除)
    • setting文件中,选中的部分要删除掉

1.2 文件介绍

web
├── manage.py			# 项目的管理,包括: 启动项目,创建app, 数据管理【不要动】【很重要】
└── web
    ├── asgi.py			# 接收网络请求【不要动】
    ├── __init__.py
    ├── settings.py		# 项目配置(模板配置,数据库配置,注册app)【常常操作】
    ├── urls.py			# url和函数的对应关系,路径【常常操作】
    └── wsgi.py			# 接收网络请求【不要动】

1.3 APP的创建和说明

添加新的app

终端在当前项目目录下,输入"python manage.py startapp app名字"

查看app下的文件

app01/
├── admin.py [固定,不用动]
├── apps.py [固定,不用动]
├── __init__.py
├── migrations [固定,不用动]
│   └── __init__.py
├── models.py [重要]对数据库进行操作
├── tests.py [固定,不用动]
└── views.py [重要] 在urls里调用的函数指向这里的视图函数

应用【blog】中各个目录作用:

  • migrations: 用于记录models中数据的变更。
  • admin.py: 映射models中的数据到Django自带的admin后台。
  • apps.py: 在新的Django版本中新增,用于应用程序的配置。
  • models.py: 创建应用程序数据表模型(对应数据库的相关操作)。
  • test.py: 创建Django测试。
  • views.py: 控制向前端显示那些数据

注册app

打开app下的apps.py文件,找到里面的类

添加到setting文件的这里

创建页面

编辑views.py里的 视图函数

from django.shortcuts import render,HttpResponse
def index(request):
    return HttpResponse('welcome to Django blog!')

编辑的urls.py 来指定访问路由

前面放访问路径,后面放函数[建立路径与函数的映射关系,以后访问路径就会执行这个函数]

记得import view文件

from django.urls import path
from app01 import views
urlpatterns = [
    # path("admin/", admin.site.urls),
    path("index/", views.index)
]
  • 命令行启动Django或者pycharm里直接运行

浏览器访问

再来一个

编辑views.py 视图函数

from django.shortcuts import render,HttpResponse
def index(request):
    return HttpResponse('welcome to Django blog!')

def user_list(request):
    return HttpResponse("用户列表")

编辑urls.py 来指定访问路由

from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
    # path("admin/", admin.site.urls),
    path("index/", views.index),
    path("user_list/", views.user_list),
]

  • 访问浏览器

总结:就是先在url里创建映射关系,然后去views里写视图函数

1.4 templates模板

为了使用HTML,这里开始引入templates模板

注意: 可以在app下创建templates目录,也可以在主目录下创建templates目录

  • 1.优先去项目的根目录下寻找

  • 2.根据app的注册顺序去app的目录下templates下寻找

  • 所以我们把刚开始配置的根目录下的templates文件夹删掉了

templates语法

如果说我们从数据库中取到了数据,如何在html页面中进行展示呢,这里需要用到templates的基本语法

单一变量

  • 首先配置路由
  • 然后写视图函数
    • 可以看到参数分别是request、模版名字、文本()

  • 然后在html中可以调用到传过来的值
    • tpl.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>  模版语法的学习 </h1>
<h1> {{ n1 }} </h1>
</body>
</html>
  • 访问

单一变量就直接用花括号,意思是传进去是什么样就显示成什么样

列表

  • 修改视图函数
def tpl(request):
    name = "丸子"
    roles = ["管理员","CEO","保安"]
    return render(request, "tpl.html", {"n1":name,"n2":roles})
  • 在html中需要这样取
<div> {{ n2.0}} </div>
<div> {{ n2.1}} </div>
<div> {{ n2.2}} </div>
  • 效果

循环【列表】

里面元素太多了,一个一个索引显然不方便,就可以用循环,有点像java里的el表达式

<div>
    列表循环:
    {% for item in n2 %}
        <span>{{ item }}</span>
    {% endfor %}
</div>
  • 效果

字典

修改views.py

def tpl(request):
    name = "丸子"
    roles = ["管理员","CEO","保安"]
    user_info = {"name": "张三", "age": 25, "sex": "男"}
    return render(request, "tpl.html", {"n1":name,"n2":roles,"n3":user_info})

修改tpl.html,根据键取获取值

<div>
    {{ n3 }}<br>
    {{ n3.name }}
    {{ n3.age }}
    {{ n3.sex }}
</div>
  • 效果

循环【字典】

获取值 values

<div>
    {% for v in n3.values %}
        <li>{{ v }}</li>
    {% endfor %}
</div>

获取键 keys

    <div>
        {% for k in n3.keys %}
            <li>{{ k }}</li>
        {% endfor %}
    </div>

获取键和值 items

<div>
    {% for k,v in n3.items %}
        <li>{{ k }} = {{ v }}</li>
    {% endfor %}
</div>
  • 效果
image-20230115132508690

列表套字典

修改视图函数

def tpl(request):
    name = "丸子"
    roles = ["管理员","CEO","保安"]
    user_info = {"name": "张三", "age": 25, "sex": "男"}
    user_list = [
        {"name": "张三", "age": 25, "sex": "男"},
        {"name": "李四", "age": 18, "sex": "男"},
        {"name": "王五", "age": 22, "sex": "女"},
    ]
    return render(request, "tpl.html", {"n1":name,"n2":roles,"n3":user_info,"n4":user_list})

修改html

<div>
    {% for item in n4 %}
        <div>{{ item.name }} {{ item.age }} {{ item.sex }}</div>
    {% endfor %}
</div>
  • 效果

条件判断

{%  if n1 == "poker" %}
    <h3>嘿嘿嘿</h3>
{% elif n1 == "toker" %}
    <h3>哈哈哈</h3>
{% else %}
    <h3>呵呵呵</h3>
{% endif %}

templates小结

本质上:模版语法是在HTML中写一些占位符,由数据对这些占位符进行替换和处理

1.5 请求和响应

重定向: 浏览器向某个网站发送请求,网站返回给浏览器一个新的URL,浏览器去访问这个新的URL地址

def something(request):
  # request是一个对象,封装了用户发送过来的所有请求相关的数据
  # 1. [请求]获取请求方式 GET/POST
  print(request.method)
  # 2. [请求]在URL上传递值
  print(request.GET)
  # 3. [请求]在请求体中提交数据
  print(request.POST)
  # 4. [响应] HttpResponse("返回内容"),内容字符串内容返回给请求者
  # return HttpResponse("返回内容")
  # 5. [响应] 读取HTML的内容+渲染(替换)->字符串,返回给用户浏览器
  return render(request,"something.html",{"title":"来了"})
	# 6. [响应] 让浏览器重定向到其他的页面
  return redirect("https://www.baidu.com")
  • 前面讲的都是第一种方式
  • 浏览器按第二种方式处理重定向,什么意思呢,就是说浏览器向服务器发送请求时,服务器返回了一个url(而不是经过渲染的html),让浏览器自己去访问

案例:用户管理

修改views.py,新增login函数

def login(request):
    if request.method == "GET":
        return render(request, "login.html")

    # 如果是 POST 请求,获取用户提交的数据
    print(request.POST)
    username = request.POST.get("user")
    password = request.POST.get("password")
    if username == "poker" and password == "123":
        return HttpResponse("登录成功") 

    #return HttpResponse("登录失败")
    return render(request, "login.html", {"error_msg": "用户名或密码错误"})

url里增加login

path('login/', views.login),

templates下新建login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <h1>用户登录</h1>
    <form method="post" action="/login/">

        {% csrf_token %}

        <input type="text" name="user", placeholder="用户名">
        <input type="password" name="password", placeholder="密码">
        <input type="submit" value="提交">
        <span style="color: red;">{{ error_msg }}</span>
    </form>
</body>
</html>

  • 出现这种错误要在form表单中加上{% csrf_token %},用来校验是不是我这个网页发过来的请求

二、数据库操作

Django开发数据库更简单,内部提供了ORM框架

2.1 ORM

ORM可以帮助我们做两件事:

  • 创建/修改/删除数据库中的表(无法创建数据库)
  • 操作表中的数据
  • 都不用写sql语句,orm会将其翻译成sql

2.2 Django连接数据库

首先在数据库里创建一个database

create database mydb DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

然后在settings.py进行配置和修改

DATABASES = {
    'default':{  		  	   
      'ENGINE':'django.db.backends.mysql', 
        'NAME':'mydb',
        'USER':'root',
        'PASSWORD':'Syz123!@#',
        'HOST':'127.0.0.1',
        'PORT':'3306',
    }
}

2.3 Django操作表

  • 创建表
  • 删除表
  • 修改表

配置app01下的models.py

会根据自定义的类创建跟app同名的表

from django.db import models

# Create your models here.
class UserInfo(models.Model):
    name = models.CharField(max_length=20)
    password = models.CharField(max_length=20)
    age = models.IntegerField()

  • orm会自动将上述语句变为sql并执行
create table app01_userInfo(
    id bigint auto_increment primary key,
    name varchar(20),
    password varchar(20),
    age int
)
  • 执行需要在根目录的终端下输入两步指令

python3 manage.py makemigrations
python3 manage.py migrate

  • 然后就可以看到数据库中有很多表(有我们自己创的userinfo,还有其他django默认配置的)

2.4 创建和修改表

  • 想再创建一个表,就在models.py里再写一个类,再调用那两条命令

  • 想删除表,就把相应的类删除或者注释,再调用那两条命令

  • 想删除列,就把那条列的代码删除或注释,再调用那两条命令

  • 如果想添加列,这时候就要注意,如果说表中本身有数据,那这是增加的列该是什么数据呢?

    • 这时候就会给两个选项,1是直接输入默认值,2是退出,在添加的列中加一个参数default=…。这样新增列就会有一个默认值
It is impossible to add a non-nullable field 'size' to userinfo without specifying a default. This is because the database needs something to populate existing rows.
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
 2) Quit and manually define a default value in models.py.
Select an option: 

  • 手动设定
age = models.IntegerField(default=2)
  • 允许为空
data = models.IntegerField(null=True, blank=True)

2.5 增删改查

  • 添加数据
    • url里添加数据
from app01.models import UserInfo
...

def orm(request):
    # 新建数据
    UserInfo.objects.create(name="poker", password="123", age=25)
    UserInfo.objects.create(name="roker", password="456", age=30)

    return HttpResponse("成功")

  • 删除数据
	# 删除数据
    UserInfo.objects.filter(id=2).delete()
    # 删除表中所有数据
    UserInfo.objects.all().delete()

  • 查询数据
data_list = UserInfo.objects.all()
print(data_list)
for obj in data_list:
    print(obj.id, obj.name, obj.password, obj.age)
  • 更新数据
UserInfo.objects.filter(name="roker").update(age=35)

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

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

相关文章

前言技术之mybatis-plus 01

目录 1.什么是mybatis-plus 2.初体验 3.日志 4.主键生成策略 5.更新 6.自动填充 1.什么是mybatis-plus 升级版的mybatis&#xff0c;目的是让mybatis更易于使用&#xff0c; 用官方的话说“为简化而生” 官网&#xff1a; MyBatis-Plus 2.初体验 1.准备数据库脚本 数据…

再获殊荣!天云数据入选第一批北京市级企业技术中心,Hubble数据库提供新一代信息技术科技服务

为助力北京国际科技创新中心建设&#xff0c;贯彻落实北京市“十四五”时期高精尖产业发展规划&#xff0c;引导和支持企业加强创新能力&#xff0c;培育和引导企业技术中心建设&#xff0c;北京市经济和信息化局组织开展了2022年度第一批北京市市级企业技术中心的创建工作&…

【Python学习笔记】5. Python3 基本数据类型(上)——数值型、字符串型

前言 Python 中的变量不需要声明。每个变量在使用前都必须赋值&#xff0c;变量赋值以后该变量才会被创建。 Python3 基本数据类型 Python 中的变量不需要声明。每个变量在使用前都必须赋值&#xff0c;变量赋值以后该变量才会被创建。 在 Python 中&#xff0c;变量就是变…

tomcat配置多个host,并且避免重复加载

目录 1.实验描述 2.实验环境 2.实验过程 2.1 创建order和user项目 2.2 打包项目 2.3 修改tomcat的server.xml的配置 2.4 启动tomcat 2.5 配置本地host 2.6 验证 1.实验描述 目前有两个域名&#xff0c;分别是&#xff1a; order.abc.com user.abc.com 两个项目&…

微信小程序学习第1天:微信小程序开发入门介绍

前言&#xff1a;微信小程序开发模式 1、申请小程序开发账号 2、安装小程序开发者工具 3、创建和配置小程序项目 一、申请小程序开发账号 1、体验小程序 2、注册小程序开发账号 使用浏览器打开https://mp.weixin.qq.com网址&#xff0c;按照提示注册 注册承购后&#xff0c…

微服务 初始 分布式搜索引擎 Elastic Search

文章目录⛄引言一、什么是Elastic Search&#xff1f;二、Elastic Search 倒排索引⛅正向索引⚡倒排索引⛄正向和倒排三、ES的一些概念⛅文档和字段⚡索引和映射四、MySQL 与 Elasticsearch⛵小结⛄引言 本文参考黑马 分布式Elastic search Elasticsearch是一款非常强大的开源…

OBB的计算python实现

OBB的计算python实现1. 实现步骤步骤① 分解点集的xyz分量步骤② 对x、y、z这三个随机变量&#xff08;一维数组&#xff09;求协方差矩阵步骤③ 对步骤②中的协方差矩阵求解特征值与特征向量&#xff0c;特征向量构造列向量矩阵M步骤④ 将点集的几何中心平移至坐标系原点&…

最全java面试题及答案(208道)

本文分为十九个模块&#xff0c;分别是&#xff1a;「Java 基础、容器、多线程、反射、对象拷贝、Java Web 、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM」 &#xff0c;如下图所…

Discord怎么抢白名单?Discord多账号防关联可以提高白名单成功率

Discord作为一个社交媒体&#xff0c;在加密货币领域扮演着重要的角色&#xff0c;它强大而便捷。更重要的是&#xff0c;如果你是一个投资者&#xff0c;Discord无疑是你了解项目动态&#xff0c;深入社区沟通交流的重要工具。 相信很多玩NFT和Web3的朋友都不会对discord 陌生…

分位数的理解与查询

目录 分位数的定义与理解&#xff1a; pyspark 中分位数查询 方式1 &#xff1a; 某列分位数查询&#xff1a; 采用dataframe的approxQuantile属性&#xff0c;返回一个list 例子&#xff1a; 方式2 &#xff1a; 转换为toPandas&#xff0c;利用pandas.dataframe利的…

全志T113-i+玄铁HiFi4开发板硬件说明书(2)

前 言 本文档主要介绍开发板硬件接口资源以及设计注意事项等内容,测试板卡为全志T113-i+玄铁HiFi4开发板,由于篇幅问题,本篇文章共分为上下两集,点击账户可查看更多内容详情,开发问题欢迎留言,感谢关注。 T113-i处理器的IO电平标准一般为1.8V和3.3V,上拉电源一般不超过…

【C++入门】命名空间的定义与使用

目  录1 命名空间1.1 命名空间定义1.2 命名空间使用1 命名空间 在C/C中&#xff0c;变量、函数和类都是大量存在的&#xff0c;这些变量、函数、类的名称将都存在于全局作用域中&#xff0c;可能会导致很多冲突。 使用命名空间的目的是对标识符的名称进行本地化&#xff0c;以…

经典动态规划OJ题目:接雨水or接青豆(多种方法,附详详细思维过程、解析及源码)

作者&#xff1a;非妃是公主 专栏&#xff1a;《算法》《刷题笔记》 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 《算法》专栏系列文章 算法设计与分析复习01&#xff1a;主方法求递归算法时间复杂度 算法设计与分析…

MySQL批量插入4种方案(对比速度起飞)

一、前言二、准备工作1、Maven项目中pom.xml文件引入的相关依赖如下2、application.yml配置属性文件内容&#xff08;重点&#xff1a;开启批处理模式&#xff09;3、Entity实体类&#xff08;测试&#xff09;4、数据库student表结构&#xff08;注意&#xff1a;无索引&#…

4.2 避免缩进错误

4.1.3 在for循环结束后执行一些操作for循环结束后再怎么做呢?通常,你需要提供总结性输出或接着执行程序必须完成的其他任务。在for循环后面&#xff0c;没有缩进的代码都只执行一次&#xff0c;而不会重复执行。下面来打印一条向全体魔术师致谢的消息&#xff0c;感谢他们的精…

爬虫实例(一) —— 5行 Python 代码爬取

大家好&#xff0c;我是 Enovo飞鱼&#xff0c;今天分享一个爬虫小案例&#xff0c;小白或者爬虫入门的小伙伴推荐阅读&#xff0c;加油&#x1f4aa;。 目录 前言 基本环境配置 爬取目标网站 爬取内容 实现代码 后面我会继续更新爬虫实例&#xff0c;与大家共同学习&am…

ubuntu设置双网卡以及多网段

前提设备有两个网卡&#xff0c;分别作为内网和外网,比如两个网卡eth0和eth1,eth0作为外网&#xff0c;eth1作为内网&#xff0c;每个人的网卡名称可能不一样&#xff0c;网卡名称可以自行查看&#xff0c;使用ifconfig命令&#xff1a;ifconfig区分内网和外网的ip外网网卡&…

如何使用 Apache IoTDB 中的 UDF

本篇作者&#xff1a;IoTDB 社区 -- 廖兰宇本文将概述用户使用 UDF 的大致流程&#xff0c;UDF 的详细使用说明请参考官网用户手册&#xff1a;https://iotdb.apache.org/zh/UserGuide/Master/Operators-Functions/User-Defined-Function.html1编写 UDFIoTDB 为用户提供编写 UD…

opensuse15.4安装android-studio-2021.1.1.23_未完成

opensuse15.4安装android_studio再运行微信apk_未完成 未完成的原因是&#xff1a;本人台式机的物理内存为4G&#xff0c;官方要求是16G android studio与android sdkj是两个完全不同的两样东西。 Android studio是一个IDE&#xff08;可视化开发工具&#xff09;跟eclipse一…

SAP 新准则IFRS 17:重新思考和革新保险会计的机会

您准备好迎接 IFRS 17 了吗&#xff1f;财务报告准则过去曾多次更改&#xff0c;但这次没有。这一变化将为准备迎接新准则的保险公司带来广泛的机遇。许多公司都有应对这些要求的战术计划。但最大的成功将由制定包括 IFRS 17 在内的更广泛报告战略的公司实现。他们不会做出回应…