1.1创建第一个 Django 项目
1.环境准备
1.安装conda
官网下载安装即可
2.配置Django环境
创建并激活了新的conda环境(环境名称:Djangopro)
创建:conda create -n Djangopro
激活:conda activate Djangopro
下载pip并安装了Python基础环境
conda install pip
查看下载的所有列表
conda list
1.2视图与URL映射
1.在url中导入视图
选其一:
(1)根路径下:
from goods import views
(2)子路径下:
from . import views
2.导入视图函数路径
urlpatterns = [
# 2.导入试图路径
# (1).不带参的视图路径
path("list",views.goods_list),
]
3.写视图函数(返回文本)
1.不带参的
def goods_list(request):
return HttpResponse("货物列表")
示图:
2.带参的:
url映射:
# (2).带参的视图路径
path("detail/<goods_id>",views.goods_detail),
视图函数:
# 2.在url中添加参数(视图中返回文本)
def goods_detail(request,goods_id):
text="您输入的货物id为:%s"%goods_id
return HttpResponse(text)
示图:
4.在url中指定命名空间
# 指定命名空间
app_name='goods'
1.3模版
1.渲染模版(返回视图)
(1).url映射
# (3).返回视图(渲染模版)
path("views",views.goods_views),
(2).创建视图函数
# 在视图中返回视图(渲染模版)
def goods_views(request):
return render(request,'index.html')
(3).在template中创建html页面(index.html')
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<p>欢迎来到仓库系统</p>
</body>
</html>
示图:
2. 渲染模版,传递变量
(1).url映射
# (4).返回视图(渲染模版,传递变量)
path("value",views.goods_values),
(2).创建视图函数
分别传递了列表、字典、对象,三个不同形式的变量。通过context进行传递。
def goods_values(request):
# 1.列表
list = {'username': 'yu',
'age':'12',
'sex':'女'}
# 2.字典
student=[{"name":"xixi","ID":"01"},
{"name":"lala","ID":"02"}]
# 3.对象
class Person:
def __init__(self,name):
self.name=name
context={
"list":list,
"student":student,
"person":Person("zhuzhu")
}
return render(request,'value.html',context=context)
3. .在template中创建html页面(value.html')
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>变量</title>
</head>
<body>
<h1>列表变量</h1>
<p>姓名:{{list.username}}</p>
<p>年龄:{{list.age}}</p>
<p>性别:{{list.sex}}</p>
<h1>数组变量</h1>
<p>所有列表:{{student}}</p>
<p>索引为0:{{student.0}}</p>
<p>索引为0的name值:{{student.0.name}}</p>
<h1>对象变量</h1>
<p>{{person.name}}</p>
</body>
</html>
示图:
3.if判断
(1).url映射
# (5).if判断
path("if",views.goods_if),
(2).视图函数
def goods_if(request):
return render(request,'if.html',context={"age":19}),
(3) .在template中创建html页面(if.html')
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>if</title>
</head>
<body>
{% if age > 18 %}
<p>已成年</p>
{% else %}
<p>未成年</p>
{% endif %}
</body>
</html>
4.for循环遍历
在 for 循环中, DTL 提供了一些变量可供使用。
这些变量如下:
forloop.counter :当前循环的下标。以 1 作为起始值。
forloop.counter0 :当前循环的下标。以 0 作为起始值。
forloop.revcounter :当前循环的反向下标值。比如列表有 5 个元素,那么第 一次遍历这个属性是等于 5,第二次是 4,以此类推。并且是以 1 作为最后一个 元素的下标。
forloop.revcounter0 :类似于 forloop.revcounter 。不同的是最后一个元素的 下标是从 0 开始。
forloop.first :是否是第一次遍历。
forloop.last :是否是最后一次遍历。
forloop.parentloop :如果有多个循环嵌套,那么这个属性代表的是上一级 的 for 循环。
(1).url映射
# (6).for遍历循环
path("for",views.goods_for)
(2).视图函数
分别遍历列表和字典
def goods_for(request):
#1.遍历列表
list={
"username":'yu',
"age":'18',
"sex":'女'
}
#2.遍历字典
student = {
"student1":{"name": "xixi", "ID": "01"},
"student2": {"name": "lala", "ID": "02"}
}
context={
"list":list,
"student":student
}
return render(request,'for.html',context=context)
(3).在template中创建html页面(for.html')
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>for</title>
</head>
<body>
<h1>遍历列表</h1>
{% for i in list %}
<p>{{ i }}</p>
{% endfor %}
<h1>遍历字典1</h1>
{% for j in student %}
<p>{{ j }}</p>
{% endfor %}
<h1>遍历字典2</h1>
{% for key,value in student.items %}
<p>{{ key }}:{{ value }}</p>
{% endfor %}
</body>
</html>
示图:
5.for循环中的变量
forloop.counter
<h1>遍历列表</h1>
{% for i in list %}
{{ forloop.counter }}
<p>{{ i }}</p>
{% endfor %}
示图:
6. with标签
with标签用来为一个复杂的变量名起别名,如果变量的值来自于数据库,在起别名后只需要使用别名即可,无需每次都向数据库发送请求来重新获取变量的值
注意:起别名的变量不能在别的语句中使用!!
方法一:
{% with stu=student %}
<h1>with标签2</h1>
{% with stu=student %}
<p>{{ stu }}</p>
{% endwith %}
{% with stu=student.student2 %}
<p>{{ stu }}</p>
{% endwith %}
示图:
方法二:
{% with student as stu %}
<h1>with标签1</h1>
{% with student.student1 as stu %}
<p>{{ stu }}</p>
{% endwith %}
{% with student.student2.name as stu %}
<p>{{ stu }}</p>
{% endwith %}
示图:
7.URL标签(<a/>)
使用反转的方式来实现,类似于 django 中的 reverse 一样。
(1).确保url映射中存在name
path("list",views.goods_list,name='list'),
(2).通过url标签进行页面跳转
<h1>url标签</h1>
<a href="{% url "goods:list" %}">首页</a>
(3).url需要传递参数
参数放在路径引号外
关键字参数
<h1>url标签(带参数)</h1>
<a href="{% url 'goods:detail' goods_id=3 %}">货物数</a>
位置参数
<h1>url标签(位置参数)</h1>
<a href="{% url 'goods:detail' 1 %}">货物数</a>
传递两个参数
注意:路径参数顺序和视图函数参数顺序一致
使用两个占位符,但是传参只用一个%,以%(a,b)的形式传参
url映射:
path("detail/<goods_id>/<goods_weight>",views.goods_detail,name='detail'),
视图函数:
def goods_detail(request,goods_id,goods_weight):
text="您输入的货物id为:%s,您的货物重量为:%s"
% (goods_id,goods_weight)
return HttpResponse(text)
Html页面:
<h1>url标签(2个参数)</h1>
<a href="{% url 'goods:detail' 1 2%}">货物详情</a>
示图:
8.模版常用过滤器
(1). add过滤器
将传进来的参数添加到原来的值上面。这个过滤器会尝试将 值 和 参数 转 换成整形然后进行相加。如果转换成整形过程中失败了,那么会将 值 和 参数 进行拼接。如果是字符串,那么会拼接成字符串,如果是列表,那么会拼接成 一个列表。
前后都是字符串
转化整型失败,前后进行字符串拼接
<p>{{person.name|add:"女"}}</p>
前后都是数值
转化整型成功,前后进行相加
<p>{{person.age|add:"1"}}</p>
前后一个是字符串一个数值
转化整型失败,前后进行字符串拼接
<p>{{person.name|add:"1"}}</p>
(2).date过滤器
(3).default过滤器
default 过滤器用于在变量为 False 或空值时提供一个默认值
基本语法:{{ 变量 | default:"默认值" }}
如果变量是以下情况之一,会显示默认值:
None(Python 中的空值)
False(布尔值假)
空字符串 ""
空列表 []、空字典 {}、空元组 ()
其他 Django 模板系统认为“假”的值。
例子:
{% if age|default:0 > 18 %}
<p>已成年</p>
{% else %}
<p>未成年</p>
{% endif %}
如果当age为空值时,便会返回0
默认值为变量
<!-- 默认值可以是另一个变量 -->
{{ user.bio | default:user.username }}
1.4.模版结构
1.include模版
include 是 Django 模板系统中非常实用的标签,它允许你将一个模板嵌入到另一个模板中,实现模板的模块化和复用。
基本语法:{% include "模板路径" %}
在其他模版中引入
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<p>欢迎来到仓库系统</p>
{% include 'value.html'%}
</body>
</html>
示图:
include向子模版传递变量
#父模版
{% include 'value.html' with person_name="singing" saying="hello everyone" %}
#子模版
<p>名字:{{ person_name }}</p>
<p>问候:{{ saying }}</p>
示图:
2.继承模版
在模板继承中最常用了标签就是 {% block %} 与 {% extends %} 标签,其中 {% block% } 标签与 {% endblock %} 标签成对出现,而 {% extends %} 放在子模板的第一行且必须是模板中的第一个标签,标志着此模板继承自父模板。
extends 标签必须放在模版的第一行。子模板中的代码必须放 在 block 中,否则将不会被渲染。
#定义父模板可被重写内容
{% block block_name %}
...可以被子模板覆盖的内容
{% endblock block_name %}
#继承父模板
{% extends '父模板名称' %}
#子模板重写父模板
{% block block_name %}
...子模板覆盖后呈现的新内容
{% endblock block_name %}
重写父模版
<header>{% block header %}网站头部{% endblock %}</header>
子模版:
{% block header %}首页 - 我的网站{% endblock %}
继承父模版
{% block title %}{% endblock %}
总结
1.block 标签需要成对出现,使用 {{ endblock }} 作为结束标签;
2.定义 block 标签名字,子模板中具有同样名称的 block 块完成对父模板的替换;
3.子模板不需要定义父模板中的所有 block,未定义时,子模板将原样使用父模板中的内容;
4.子模板需要使用 {% extends %} 标签继承父模板,且必须是模板中的第一个标签,并放在文件的第一行;
1.5加载静态文件
1. 基本配置
第一步:确保 INSTALLED_APPS 包含 django.contrib.staticfiles
# settings.py
INSTALLED_APPS = [
...
'django.contrib.staticfiles',
...
]
第二步:配置静态文件相关设置
# settings.py
STATIC_URL = '/static/' # 静态文件的URL前缀
# 开发环境下静态文件目录
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
# 生产环境收集静态文件的目录
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
2. 开发环境使用静态文件
第一步:创建静态文件目录
第二步: 在模板中加载静态文件
首先在模板顶部加载 static 标签:
{% load static %}
然后使用以下方式引用静态文件:
<!-- 加载CSS文件 -->
<link rel="stylesheet" href="{% static 'css/style.css' %}">
<!-- 加载JavaScript文件 -->
<script src="{% static 'js/app.js' %}"></script>
<!-- 加载图片 -->
<img src="{% static 'images/logo.png' %}" alt="Logo">
1.6操作mysql数据库
1. Django 配置连接数据库
第一步:在 settings.p y 文件中配置数据库
DATABASES = {
"default": {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'students', # 数据库名
'USER': 'root', # 数据库用户名
'PASSWORD': '041213', # 数据库密码
'HOST': 'localhost', # 数据库服务器地址
'PORT': '3306',
}
}
第二步:安装 mysqlclient
切换到项目解释器路径下:
pip install mysqlclient
报错:
AttributeError: module 'MySQLdb' has no attribute '__version__'
强制重新安装 mysqlclient
pip uninstall mysqlclient -y
pip install --no-cache-dir mysqlclient
安装成功后验证安装完整性
# 检查安装路径
python -c "import MySQLdb; print(MySQLdb.__file__)"
# 正常应输出类似:D:\Anaconda\Lib\site-packages\MySQLdb\__init__.py
# 检查依赖项
pip check mysqlclient
切换到项目根路径:
测试基础功能
python -c "import MySQLdb; print(MySQLdb.connect('localhost', 'root', '041213', 'students'))"
如果连接成功,说明功能正常
执行迁移(确保 settings.py 中的数据库配置与测试一致)
python manage.py migrate