这里写目录标题
Django
1 django安装
pip install djiango
1.1 python目录
:/python37
- python.exe
- scripts
- pip.exe
- django-admin.exe [工具,创建django项目中的文件和问价夹]
-lib
- 内置模块
- site-packages
- openpyxl
- flask
- django [框架的源码]
2 创建项目
- 打开终端进入某个目录
cd D:/...
- 执行创建命令
django-admin startproject 项目名称
2.1 pychrm创建
2.2 django项目目录
web
├── db.sqlite3
├── manage.py # 项目的管理,包括: 启动项目,创建app, 数据管理 [不动]
└── web
├── __init__.py
├── settings.py # 项目配置(模板配置,数据库配置,注册app) 【!】
├── urls.py # url和函数的对应关系 【!】
├── asgi.py # 接收网络请求 [不动]
└── wsgi.py # 接收网络请求 [不动]
3 创建app
3.1 终端创建app
django-admin startapp app01
3.2 app 目录
-app011
├── __init__.py
├── admin.py 映射models中的数据到Django自带的admin后台。
├── apps.py 在新的Django版本中新增,用于应用程序的配置。app启动类
├── migrations 用于记录models /(数据库)中数据的变更。
│ └── __init__.py
├── models.py 创建应用程序数据表模型 【!】对应数据库的相关操作。
├── tests.py 创建Django测试。单元测试
└── views.py 控制向前端显示那些数据 【!】试图函数
4 快速上手
4.1 注册app
settings.py 添加
'app01.apps.App01Config'
4.2 编写url和函数关系[url.py]
4.3 编写视图函数
4.4 启动django程序
- 命令行启动(配置了pychrm终端的环境变量)
python manage.py runserver
- Pycharm启动
总结
app目录下.
新建templates文件夹存放html文件
写的时候的关键代码:
url.py
from tj import views
urlpatterns = [
# 访问.../index/ -->执行views中index函数
path('login/', views.login),
]
views.py
render内部读取html到内存,并返回给用户
from django.shortcuts import render, HttpResponse
def login(request):
return render(request, "login.html ")
注意:html寻找顺序:
settings.py 中的TEMPLATES = [ ]写了
‘DIRS’: [os.path.join(BASE_DIR , ‘…/…/TableIdentification/templates’)],
- 有限在根目录下的templates中寻找
- 根据app注册顺序,在每一个app下的template目录中寻找
‘DIRS’: [],
不在根目录下寻找,直接去app目录下寻找templates
静态文件
新建static 文件存放静态文件
tj app名字
├─migrations
│ └─__pycache__
├─static 静态文件
│ ├─css
│ ├─img
│ ├─js
│ └─plugins
│ ├─bootstrap
│ │ ├─css
│ │ ├─fonts
│ │ └─js
├─templates html代码
└─__pycache__
{% load static %} html存入内存后起作用:将static加载过来
相对路径
href="{% static ‘已经在static路径下/… %}’ 占位符 执行static函数
html模板
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="{% static 'plugins/bootstrap/css/bootstrap.css'%}">
</head>
<body>
<input type="text" class="btn btn-primary" value="asd">
<img src="{% static 'img/senlin.jpg' %}">
<script src="{% static 'js/jquery-3.4.1.js' %}"></script>
<script src="{% static 'plugins/bootstrap/js/bootstrap.js'%}"
</body>
</html>
5 模板语法
本质:在html上写一些占位符,由数据对这些占位符进行替换和处理
传递变量
列表
列表循环
<div>
{% for i in l %}
<span>列表i:{{ i }}</span>
{% endfor %}
</div>
字典
def test(request):
dist = {"name": 0, "age": 203,"ad": "ad0"}
return render(request, 'test.html',
{
"d": dist
})
<div>{{ d.name }}</div>
<div>{{ d.age }}</div>
<div>{{ d.ad }}</div>
字典循环
keys
<div>
{% for k in d.keys%}
<h5>{{ k }} </h5>
{% endfor %}
</div>
values
<div>
{% for v in d.values%}
<h5>{{ v }} </h5>
{% endfor %}
</div>
k@v
<div>
{% for k,v in d.items %}
<h5>{{ k }} ::{{ v }}</h5>
{% endfor %}
</div>
列表套字典
def test(request):
data_l = [
{"name": 1, "age": 23, "ad": "ad1"},
{"name": 2, "age": 23, "ad": "ad2"},
{"name": 3, "age": 23, "ad": "ad3"}
]
return render(request, 'test.html',
{
"dl": data_l
})
<div>
{{ dl.0.ad }}
{{ dl.1.age }}
{{ dl.2.ad }}
</div>
{% for i in dl %}
<div>{{ i.name }} {{ i.ad }}</div>
{% endfor %}
条件判断
{% if d1 == 'c/window' %}
<h5>if</h5>
{% else %}
<h5>else</h5>
{% endif %}
<h5>endif</h5>
6 请求和响应
重定向: 浏览器向某个网站发送请求,网站返回给浏览器一个新的URL,浏览器去访问这个新的URL地址
修改blog下的views.py, 根据情况去掉下面代码的注释进行测试
# 导入 redirect 包(重定向)
from django.shortcuts import render, redirect
...
# 增加新函数
def something(request):
# request 是一个对象,封装了用户发送过来的所有请求相关数据
# 1.[请求]获取请求的方式
print("用户请求的方式: " + request.method)
# 2.[请求]在URL上传递值, 例如: http://123.249.26.154:5900/something/?n1=1&n2=2
print(request.GET)
# 3.[请求]在请求体中提交数据,目前是空值
print(request.POST)
# 4.[响应]HttpResponse("返回内容"), 内容字符串内容返回给请求者
# return HttpResponse("返回内容")
# 5.[响应]读取HTML的内容 + 渲染(替换) => 字符串,返回给用户浏览器
# 需要在 blog/templates 下新建`something.html`
#return render(request, 'something.html', {"title": "hello"})
# 6.[响应] 让浏览器重定向到其他的页面
return redirect("http://www.baidu.com")
案例:用户登录
url.py添加
path('login/', views.login),
views.py
def login(request):
if request.method == "GET":
return render(request, "login.html")
print(request.POST)
u = request.POST.get("user")
p = request.POST.get("pwd")
if u == "root" and p == "123":
# return HttpResponse("登录成功")
return redirect("http://www.baidu.com")
# return HttpResponse("登录失败")
return render(request,"login.html",{"error":"pwd or user error"})
{% csrf_token %} 必须加上
否则:
创建login.html
action 为提交表单给谁,/login/ 就可以找到views.py中 def login() 函数
</h1>用户登录</h1>
<form method="post" action="/login/">
{% csrf_token %}
<input type="text" name="user" placeholder="用户名">
<input type="password" name="pwd" placeholder="密码">
<input type="submit" value="提交">
<span style="color: red">{{ error }}</span>
</form>
浏览器访问,输入错误的用户名和密码,输对跳转百度
7 数据库操作
Django开发操作数据库更简单,内部提供了ORM框架
- 安装第三方模块 mysqlclient
参考链接: https://blog.csdn.net/m0_67155975/article/details/123138225
yum -y install mysql-devel
yum -y install python-devel
pip3 install mysqlclient
- 官网下载https://pypi.org/project/mysqlclient/#files
orm框架
创建/修改/删除数据库中的表(无法创建数据库)
操作表中的数据 (非sql语句)
- 创建数据库
create database mydb DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
-
链接数据库
注释掉
添加
# 链接数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test',
'USER': 'root',
'PASSWORD': 'root',
'HOST': '127.0.0.1',
'PORT': '3306'
}
}
Django操作表
在models.py中
from django.db import models
class UserInfo(models.Model):
name = models.CharField(max_length=32)
password = models.CharField(max_length=64)
age = models.IntegerField()
#自动转化为
# create table tj_useringo(
# id bigint auto_increment primary key,
# name varchar(32),
# password vachar(64)
# age int
# );
在服务器中项目根目录下执行命令
python3 manage.py makemigrations
python3 manage.py migrate
会根据自定义的类创建跟【app_类名】的表
遇到问题:版本不兼容
django.db.utils.NotSupportedError: MySQL 5.7 or later is required (found 5.6.47).
django版本降级
豆瓣镜像安装
pip3 uninstall django
pip install django==2.1.12 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
遇到问题:
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?
增加models.py代码
import pymysql
pymysql.install_as_MySQLdb()
import pymysql
pymysql.install_as_MySQLdb()
# 链接数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'bm',
'USER': 'root',
'PASSWORD': 'root',
'HOST': '127.0.0.1',
'PORT': '3306'
}
}
执行成功
修改表结构
如果不想要某个表,将class类注释后,重新执行两个命令即可
修改直接在类中修改,重新执行命令
在表中新增列时,新增列需要指定对应数据
-
手动输入默认值
-
设置默认值
data= models.IntegerField(default=2)
- 允许为空
data= models.IntegerField(null=True,blank=True)
重新执行
python manage.py makemigrations
python manage.py migrate
修改数据
- 增
1.views.py
from tj.models import UserInfo #引入类
def xxorm(request):
UserInfo.objects.create(name="ormcreat", password="orm", age="20")
return render(request, "xxorm.html")
在访问…/xxorm/时自动添加到数据库
2.models.py
UserInfo.objects.create(name="djcreat", password='dj', age=99)
执行
python manage.py makemigrations
python manage.py migrate
或者访问页面
添加到数据库
- 删
一下都在views.py下进行
# 删除数据
UserInfo.objects.filter(id=2).delete()
# 删除表中所有数据
UserInfo.objects.all().delete()
- 改
UserInfo.objects.filter(name="roker").update(age=35)
- 查
获取所有数据
data_list 为QuerySet数据类型
类似列表
data_list = UserInfo.objects.all()
print(data_list)
for obj in data_list:
print(obj.id, obj.name, obj.password, obj.age)
筛选获取数据
d1 = UserInfo.objects.filter(id = 4)
print(d1[0].id, d1[0].name, d1[0].password, d1[0].age)
return render(request, "xxorm.html")
如果只有一行数据,后面可以加.first直接得到行数据
row_obj = UserInfo.objects.filter(id = 4).first()
案例:用户管理
展览
url.py
path('xxorm/', views.xxorm),
views.py
datalist = UserInfo.objects.all()
if request.method == "GET":
return render(request, "xxorm.html",{'datalist':datalist})
xxorm.html
<table>
<thead>
<tr>
<th>Id</th>
<th>Name</th>
<th>passward</th>
<th>age</th>
<th>data</th>
</tr>
</thead>
<tbody>
{% for i in datalist %}
<tr>
<td>{{ i.id }}</td>
<td>{{ i.name }}</td>
<td>{{ i.password }}</td>
<td>{{ i.age }}</td>
<td>{{ i.data }}</td>
</tr>
{% endfor %}
</tbody>
</thead>
</table>
增加
views.py
id = request.POST.get("id")
name = request.POST.get("name")
password = request.POST.get("password")
age = request.POST.get("age")
UserInfo.objects.create(id = id, name = name, password = password, age = age )
datalist = UserInfo.objects.all()
return render(request, "xxorm.html",{'datalist':datalist})
xxorm.html
<form action="/xxorm/" method="post" >
{% csrf_token %}
<input type="text" name="id" placeholder="id" >
<input type="text" name="name" placeholder="name">
<input type="text" name="password" placeholder="pwd">
<input type="text" name="age" placeholder="age">
<input type="submit" value="提交">
</form>
删除
views.py
点击删除,GET请求中存在id=“??”,delid会接受传过来的要删除的id
如果不是点的删除的get请求,delid为None,不会执行.delete()操作
datalist = UserInfo.objects.all()
if request.method == "GET":
delid=request.GET.get("id")
if bool(delid):
UserInfo.objects.filter(id=delid).delete()
datalist = UserInfo.objects.all()
return render(request, "xxorm.html",{'datalist':datalist})
xxorm.html
{% for i in datalist %}
<tr>
<td>{{ i.id }}</td>
<td>{{ i.name }}</td>
<td>{{ i.password }}</td>
<td>{{ i.age }}</td>
<td>
<a href="/xxorm/?id={{ i.id }}">删除</a>
</td>
</tr>
{% endfor %}
完整案例
views.py
def xxorm(request):
datalist = UserInfo.objects.all()
if request.method == "GET":
delid=request.GET.get("id")
if bool(delid):
UserInfo.objects.filter(id=delid).delete()
datalist = UserInfo.objects.all()
return render(request, "xxorm.html",{'datalist':datalist})
id = request.POST.get("id")
name = request.POST.get("name")
password = request.POST.get("password")
age = request.POST.get("age")
UserInfo.objects.create(id = id, name = name, password = password, age = age )
datalist = UserInfo.objects.all()
return render(request, "xxorm.html",{'datalist':datalist})
xxorm.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
form{
margin:30px;
}
</style>
</head>
<body>
<h1>orm测试</h1>
<form action="/xxorm/" method="post" >
{% csrf_token %}
<input type="text" name="id" placeholder="id" >
<input type="text" name="name" placeholder="name">
<input type="text" name="password" placeholder="pwd">
<input type="text" name="age" placeholder="age">
<input type="submit" value="提交">
</form>
<table>
<thead>
<tr>
<th>Id</th>
<th>Name</th>
<th>passward</th>
<th>age</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for i in datalist %}
<tr>
<td>{{ i.id }}</td>
<td>{{ i.name }}</td>
<td>{{ i.password }}</td>
<td>{{ i.age }}</td>
<td>
<a href="/xxorm/?id={{ i.id }}">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</thead>
</table>
</body>
</html>