安装Django
查看是否安装python
python --version
或
python -v
命令行安装Django
//安装Django
pip install django
//查看django版本
pip show django
C:\Users\wangcheng>pip show django
Name: Django
Version: 5.1.3
Summary: A high-level Python web framework that encourages rapid development and clean, pragmatic design.
Home-page: https://www.djangoproject.com/
Author:
Author-email: Django Software Foundation <foundation@djangoproject.com>
License: BSD-3-Clause
Location: C:\Users\wangcheng\AppData\Roaming\Python\Python312\site-packages
Requires: asgiref, sqlparse, tzdata
Required-by:
配置环境变量
- 使用pip show django 可以查看django安装路径
- 进入Django安装路径:C:\Users\wangcheng\AppData\Roaming\Python\Python312\site-packages
- 将上一层级Scripts及django配置到path中
配置Scripts
Scripts:为django安装路径下的Scripts文件夹,而不是python安装路径中的Scripts文件夹
C:\Users\wangcheng\AppData\Roaming\Python\Python312\Scripts
配置django
C:\Users\wangcheng\AppData\Roaming\Python\Python312\site-packages\django
创建Django项目
django-admin startproject HelloWorld
- HelloWorld: 项目的容器。
- manage.py: 一个实用的命令行工具,可让你以各种方式与该 Django 项目进行交互。
- HelloWorld/init.py: 一个空文件,告诉 Python 该目录是一个 Python 包。
- HelloWorld/asgi.py: 一个 ASGI 兼容的 Web 服务器的入口,以便运行你的项目。
- HelloWorld/settings.py: 该 Django 项目的设置/配置。
- HelloWorld/urls.py: 该 Django 项目的 URL 声明; 一份由 Django 驱动的网站"目录"。
- HelloWorld/wsgi.py: 一个 WSGI 兼容的 Web 服务器的入口,以便运行你的项目。
启动项目
cd HelloWorld
python manage.py runserver 0.0.0.0:8099
视图和url配置
在HelloWorld/HelloWorld目录下创建view.py
from django.http import HttpResponse
def hello(request):
return HttpResponse("Hello world !")
在HelloWorld/HelloWorld/urls.py文件中配置跳转路径
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path("",views.hello,name="hello"),
]
path()函数
path()函数语法格式
path(route, view, kwargs=None, name=None)
path() 可以接收四个参数,分别是两个必选参数:route、view 和两个可选参数:kwargs、name。
- route: 字符串,定义 URL 的路径部分。可以包含变量,例如 int:my_variable,以从 URL 中捕获参数并将其传递给视图函数。
- view: 视图函数,处理与给定路由匹配的请求。可以是一个函数或一个基于类的视图。
- kwargs(可选): 一个字典,包含传递给视图函数的额外关键字参数。
- name(可选): 为 URL 路由指定一个唯一的名称,以便在代码的其他地方引用它。这对于在模板中生成 URL 或在代码中进行重定向等操作非常有用。
re_path()函数
re_path() 方法来兼容 1.x 版本中的 url() 方法,一些正则表达式的规则也可以通过 re_path() 来实现 。
from django.urls import include, re_path
urlpatterns = [
re_path(r'^index/$', views.index, name='index'),
re_path(r'^bio/(?P<username>\w+)/$', views.bio, name='bio'),
re_path(r'^weblog/', include('blog.urls')),
...
]
使用模版
与manage.py同级创建templates目录,里面可以放html文件模版
创建模版html文件
hello.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
</head>
<body>
<h1>{{hello}}</h1>
</body>
</html>
修改settings.py中的TEMPLATES
DIRS中添加[Path(BASE_DIR,‘templates’)]
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [Path(BASE_DIR,'templates')], #修改位置
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
如果在TEMPLATES设置了此项会先查找根目录下的templates文件,然后根据app注册顺序逐个去找app目录下templates文件夹
如果不设置会先根据app注册顺序逐个查找app目录下的templates文件夹
配置静态文件
静态文件放在templates同级的static目录下
在html文件中引入静态文件
可以使用相对路径 /static/img/1.png
可以使用load static引入
- html文件顶部
{% load static %}
- 需要引入的地方
{% static '文件路径'%}
编写views.py
from django.http import HttpResponse
from django.shortcuts import render
def hello(request):
return HttpResponse("Hello world !")
def index(request):
context = {}
context['hello'] = 'Hello world Everyone!'
return render(request,'hello.html',context)
修改urls.py
from django.contrib import admin
from django.urls import path
from . import views
from . import views,testdb
urlpatterns = [
path('admin/', admin.site.urls),
path("",views.hello,name="hello"),
path("hello/",views.index),
path("testdb/",testdb.testdb),
path("selectTest/",testdb.testdb_select),
path("updateTest/",testdb.testdb_update),
path("delTest/",testdb.testdb_del),
]
至此Django项目已经创建完成,启动项目,访问8099端口,可以查看项目。
后面会继续进行连接数据库等相关知识
创建模型
python manage.py startapp app01
或者
django-admin startapp app01
- apps.py 固定,不用动,启动文件
- admin.py 固定,不用动,django自带的admin管理页面
- migrations文件 固定,不用动,数据库变更记录
- tests.py 做单元测试
- models.py 重要 数据库模型
- views.pyg 重要 视图函数
注册APP
在 settings.py中注册app
根据模型项目名->文件名->类名进行注册,写成:项目名.文件名.类名 即:app01.apps.App01Config
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01.apps.App01Config'
]
模板语法
本质上:在HTML中写一些占位符,由数据对这些占位符进行替换和处理
函数
from django.shortcuts import render,HttpResponse
# Create your views here.
def tpl(request):
name = "刘备"
# 列表
roles = ["管理员","CEO","保安"]
# 字典
user_info = {"name":"诸葛亮","salary":100000,"role":"CTO"}
# 列表套字典
data_list = [
{"name": "诸葛亮", "salary": 100000, "role": "CEO"},
{"name": "关羽", "salary": 100000, "role": "CTO"},
{"name": "张飞", "salary": 100000, "role": "COO"}
]
return render(request,'tpl.html',{"n1":name,"n2":roles,"n3":user_info,"n4":data_list})
模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>模板语法学习</h1>
<div>{{ n1 }}</div>
<div>{{ n2 }}</div>
<!-- 取列表中的数据-->
<div>{{ n2.0 }}</div>
<div>{{ n2.1 }}</div>
<div>{{ n2.2 }}</div>
<!--for循环-->
<div>
{% for item in n2 %}
<span>{{item}}</span>
{% endfor %}
</div>
<hr/>
{{n3}}
{{n3.name}}
{{n3.salary}}
{{n3.role}}
{% for k,v in n3.items %}
<li>{{k}} = {{v}}</li>
{% endfor %}
<hr/>
{{n4}}
{{n4.1}}
{{n4.1.name}}
{{n4.1.salary}}
{% for item in n4 %}
<div>{{item.name}} {{item.salary}}</div>
{% endfor %}
<hr/>
{% if n1 == "刘备" %}
<h1>哒哒哒哒哒</h1>
{% elif n1 == "xxx" %}
<h1>啦啦啦啦啦</h1>
{% else %}
<h1>抖抖抖抖抖</h1>
{% endif %}
</body>
</html>
模板加载过程
- 读取含有模板语法的HTML文件
- 内部进行渲染(模板语法执行并替换数据),最终得到只包含HTML标签的字符串
- 将渲染(替换)完成的字符串返还给用户浏览器
请求和响应
def something(request):
# request 是一个对象,封装了用户通过浏览器发送过来的所有数据
# 1.获取请求方式
print(request.method)
# 2.在URL上传递值
print(request.GET)
# 3.在请求体中提交数据
print(request.POST)
# 4.HttpResponse("返回内容") 返回字符串给请求者
# HttpResponse("返回内容")
# 5.读取HTML的内容 + 渲染(替换) -> 字符串,返回给请求者
# render(request,'something.html',{"title":"来了"})
# 6.让浏览器重定向到其他页面,返回一个链接,浏览器再去请求链接
return redirect("https://www.baidu.com")
数据库操作
Mysql + pymsql
Django开发操作数据库
Django开发操作数据库更简单,提供了ORM框架
安装第三方模块
pip install mysqlclient
ORM操作表
ORM可以帮助我们做两件事:
- 创建、修改、删除数据库中的表(不用写SQL语句),无法创建数据库
- 操作表中的数据(不用写SQL语句)
- 创建数据库
CREATE DATABASE `mysite2` /*!40100 DEFAULT CHARACTER SET utf8mb3 */ /*!80016 DEFAULT ENCRYPTION='N' */;
- Django配置数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mysite2', # 数据库名字
'USER': 'root',
'PASSWORD': 'root',
'HOST': '127.0.0.1',
'PORT': '3306'
}
}
- 创建表模型
在app中的models.py中创建
from django.db import models
# Create your models here.
class UserInfo(models.Model):
name = models.CharField(max_length=32)
password = models.CharField(max_length=64)
age = models.IntegerField()
- 执行命令在数据库中创建表
python manage.py makemigrations
python manage.py migrate
-
在已有表中新增列时,由于已存在的列中可能已有数据,所以新增列必须要指定新增列对应的数据
-
选项1. 手动输入一个值
-
选项2 设置默认值
age = models.IntegerField(default=2)
-
允许为空
data = models.IntegerField(null=True,blank=True)
-
以后在开发中如果想要对表结构进行调整,在models.py文件中操作类即可,修改好类执行命令进行同步
ORM操作表中的数据
def orm(request):
# 新增表数据
# DepartMent.objects.create(title="销售部")
# DepartMent.objects.create(title="IT部")
# DepartMent.objects.create(title="运营部")
#
# UserInfo.objects.create(name="刘备",password="999",age=30)
# UserInfo.objects.create(name="关羽", password="666", age=29)
# UserInfo.objects.create(name="张飞", password="888", age=29)
# 删除表数据
# UserInfo.objects.filter(id=3).delete()
# DepartMent.objects.all().delete()
# 获取数据
# 结果可以理解成列表,里面是[行,行] QuerySet类型
# data_list = UserInfo.objects.all()
# for obj in data_list:
# print(obj.id,obj.name,obj.password,obj.age)
# 使用filter虽然只有一条,但结果是QuerySet类型的列表
# data_list = UserInfo.objects.filter(id=1)
# 使用first()只获取一条数据
# obj = UserInfo.objects.filter(id=1).first()
## 更新数据
UserInfo.objects.filter(id=2).update(age=28)
UserInfo.objects.filter(name="刘备").update(age=29)
return HttpResponse("成功")