目录
1. 安装与启动
django-admin startproject mysite --创建名为“mysite”的项目
cd mysite --进入该项目目录下
python manage.py runserver --启动服务
2. 默认文件介绍
【manage.py】项目的管理:启动项目、创建app、数据库管理等。不需修改。 常使用。
【asgi.py】【wsgi.py】接收网络请求。不需修改。
【setting.py】项目配置:连接数据库等。常操作。
【urls.py】url与函数的对应关系。常操作。
3. APP
在终端Terminal按以下输入,创建名为“app01”的app。
python manage.py startapp app
【migrations】数据库变更记录。
【admin.py】django默认提供了admin后台管理。
【apps.py】app启动。
【models.py】对数据库操作。常操作。
【tests.py】用于单元测试。
【views.py】 定义视图函数。定义【urls.py】的函数。常操作。
4. 快速上手
1. 确保app注册:setting.py中INSTALLED_APPS中加入"app01.apps.App01Config"
2. 编写url和视图函数对应关系【url.py】
3. 编写视图函数【views.py】
5. 模板和静态文件
5.1 templates模板
1. 创建html: app01下创建templates文件夹,在templates下创建.html。
2.url.py编写url与函数对应关系
3.views.py
# views.py
def user_list(request):
return render(request, "user_list.html")
注:.html根据app的注册顺序,在app目录下寻找到templates,再寻找.html。
5.2 静态文件
图片、JS、CSS、插件。
在app目录下创建static,static下创建css、img、js、plugins。
引入静态文件,置顶写入{% load static %} 路径{% static '静态文件路径' %}。
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="{% static 'plugins/bootstrap-5.0.1/bootstrap.min.css'%}">
</head>
<body>
<input type="text" class="btn btn-primary" value="新建">
<img src="{% static 'img/background.webp' %}" alt="">
<script src="{% static 'plugins/bootstrap-5.0.1/bootstrap.bundle.min.js'%}"></script>
</body>
</html>
6. 模板语法
# views.py
def tpl(request):
name = "GWJ"
roles = ['管理员', '保安']
user_info = {'name':'GWJ', 'age':22, 'role':'stu'}
data_list=[
{'name':'GWJ', 'age':22, 'role':'stu'},
{'name':'LJW', 'age':22, 'role':'stu'},
{'name':'GGG', 'age':22, 'role':'stu'}
]
return render(request, "tpl.html", {"n1": name, "n2": roles, "n3": user_info, "n4": data_list})
<!-- tpl.html -->
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="{% static 'plugins/bootstrap-5.3.0/css/bootstrap.css'%}">
</head>
<body>
<h3>模板语法学习</h3>
<div>{{ n1 }}</div>
<!-- 列表使用0 1 2下标查询 -->
<div>{{ n2 }}</div>
<div>{{ n2.0 }}</div>
<div>{{ n2.1 }}</div>
<div>
<!-- 列表循环查询 -->
{% for item in n2 %}
<span>{{ item }}</span>
{% endfor %}
</div>
<!-- 字典使用key查询 -->
<div>{{ n3 }}</div>
<div>{{ n3.name }}</div>
<div>{{ n3.age }}</div>
<!-- 字典循环查询 -->
<ul>
{% for k,v in n3.items %}
<li>{{ k }} = {{ v }}</li>
{% endfor %}
</ul>
<div>{{ n4 }}</div>
<div>{{ n4.1 }}</div>
<div>{{ n4.1.name }}</div>
{% for item in n4 %}
<div>{{ item.name }}</div>
{% endfor %}
<!-- 条件语句 -->
{% if n1 == "GWJ" %}
<h1>啦啦啦</h1>
{% else %}
<h1>哈哈哈</h1>
{% endif %}
<script src="{% static 'js/query-3.6.3.min.js' %}"></script>
<script src="{% static 'plugins/bootstrap-5.3.0/js/bootstrap.js' %}"></script>
</body>
</html>
结构过程:
例如,此页面中得到的是渲染后的html,而不是有{}的html文件。
7. 请求和响应
# views.py
def reqst(request):
# requst是一个对象,封装了用户发过来的所有数据。
# 1.获取请求方式 GET/POST
print(request.method)
# 2.在URL传递一些值 ?name="GWJ"&&age=12
print(request.GET)
# 3.在请求体中提交数据
print(request.POST)
# 4.【响应】HttpResponse("返回内容"),字符串内容返回给用户。
# return HttpResponse("成功!")
# 5.【响应】读取HTML+渲染 -> 字符串,返回给用户浏览器。
# return render(request, "reqst.html")
# 6.【响应】让浏览器重定向到其他页面。
return redirect("https://www.baidu.com")
注:重定向是浏览器向网站请求,返回后,请求者再向百度请求
7.1 案例:用户登录
问题:Forbidden
解决:在form表单中加{% csrf_token %}
# views.py
def login(requst):
if requst.method == "GET":
# 以get方式提交
return render(requst, "login.html")
else:
# 以post方式提交时,获取数据
print(requst.POST)
username = requst.POST.get("user")
password = requst.POST.get("pwd")
if username == "admin" and password == "123":
# return HttpResponse("登陆成功!")
return redirect("https://www.baidu.com")
else:
return render(requst, "login.html", {"error_msg":"用户名或密码错误"})
<!-- login.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>用户登录</h3>
<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_msg }}</span>
</form>
</body>
</html>
8. Djongo操作MongoDB(×)
环境pymongo == 3.12.1,djongo == 1.3.4。
8.1 连接
# setting.py
DATABASES = {
"default": {
"ENGINE": "djongo",
"ENFORCE_SCHEMA": True,
"NAME": "demo0",
"HOST": "127.0.0.1",
"PORT": 27017
}
}
8.2 创建collections
# models.py
# 添加model,类-->collection
from djongo import models
class mycol(models.Model):
name = models.CharField(max_length=16)
password = models.CharField(max_length=32)
age = models.IntegerField(default=0)
models.py改变,在终端需要迁移:
python manage.py makemigrations
python manage.py migrate
mongodb生成"_id",类型为ObjectId。
使用Djongo自动生成"id"列,类型为integer。
8.3 操作数据库
# urls.py
urlpatterns = [
# 添加对应关系
path("mon/login/", views.mon_login),
]
# views.py
from .models import mycol
from django.db.models import Q
def mon_login(request):
# 创建documents
mycol.objects.create(name='GWJ', password='', age=22, email="488378705@qq.com")
mycol.objects.create(name='LJW', password='', age=22, email="LJW@qq.com")
mycol.objects.create(name='XTT', password='', age=22, email="XTT@qq.com")
# 删除documents
mycol.objects.filter(name='GWJ').delete() # 删除符合条件的
mycol.objects.all().delete() # 删除全部
# 查询documents
# mycol.objects.all()获取到的是QuerySet类型
# 查询所有
queryset = mycol.objects.all() # 得到的是对象列表queryset = [<mycol: mycol object>, <mycol: mycol object>]
# 遍历输出
for obj in queryset:
print(obj.name, obj.password, obj.age, obj.email)
queryset = mycol.objects.filter(name='LJW') 得到符合条件的对象列表
# 查询第一条数据
obj = mycol.objects.first() # 得到一个对象<mycol: mycol object>
# 查询筛选后的第一条数据
obj = mycol.objects.filter(name='LJW').first() #得到符合条件的一个对象
queryset = mycol.objects.filter(age__gt=22) # 年龄 > 22
queryset = mycol.objects.filter(name__startswith='X').first() # 字符串以L起始
queryset = mycol.objects.filter(Q(age__gte=9) & Q(age__lte=12)) # 查询年龄在9~12之间(含)的
# 更新documents
mycol.objects.filter(name='LJW').upadte(password="753")
return HttpResponse("添加成功!")
8.4 案例--用户列表
8.4.1 展示用户列表
- 获取所有用户信息
- HTML渲染
# urls.py
path("info/list/", views.info_list),
# views.py
def info_list(request):
# 1.获取数据
queryset = mycol.objects.all()
# 2.传递数据
return render(request, "info_list.html", {"data_list": queryset})
<!-- info_list.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>用户列表</h2>
<table border="1">
<thead>
<tr>
<th>name</th>
<th>password</th>
<th>age</th>
<th>email</th>
</tr>
</thead>
<tbody>
{% for obj in data_list %}
<tr>
<td>{{ obj.name }}</td>
<td>{{ obj.password }}</td>
<td>{{ obj.age }}</td>
<td>{{ obj.email }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
8.4.2 添加用户
- GET,看到页面,输入内容
- POST,提交数据-->写入数据库
# urls.py
path("info/add/", views.info_add),
# views.py
def info_add(request):
if request.method == "GET":
return render(request, "info_add.html")
# 获取用户提交的数据
name = request.POST.get("name")
pwd = request.POST.get("pwd")
age = request.POST.get("age")
email = request.POST.get("email")
# 添加到数据库
mycol.objects.create(name=name, password=pwd, age=age, email=email)
return redirect("/info/list/")
# info_add.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>添加用户</h2>
<form action="/info/add/" method="post">
{% csrf_token %}
<input type="text" name="name" placeholder="请输入用户名">
<input type="text" name="pwd" placeholder="请输入密码">
<input type="text" name="age" placeholder="请输入年龄">
<input type="text" name="email" placeholder="请输入邮箱">
<input type="submit" value="提交">
</form>
</body>
</html>
8.4.3 删除用户
根据id(主键)删除。
# urls.py
path("info/delete/", views.info_delete),
# views.py
from bson.objectid import ObjectId
def info_delete(request):
nid = request.GET.get('nid')
mycol.objects.filter(id=ObjectId(nid)).delete() # 关键代码
return redirect("/info/list/")