标签:py request 视图 Django 学习 html 笔记 django 模板
Django学习笔记(二)
一、Django的“MTV”模式
MTV模式
- M:Model(模型层),负责与数据库交互,与MVC中的M作用一致
- T:Templates(模板层),负责在浏览器上呈现内容,与MVC中的V相似
- V:View(视图层),核心层,负责接收请求、获取数据、返回结果,视图层与urls.py配合使用,起到的作用于MVC模式中的Controller层大概相似
二、视图层
1. 介绍
视图层(View):负责接收请求、获取数据、返回结果
初学时,最常见的操作就是编写视图函数和配置相应转发url路径。
2. 视图函数
视图函数用于接收浏览器请求HttpRequest对象,处理后通过HttpResponse对象返回响应。
在项目同名目录下创建views.py(名称随意,一般写成views)文件,一般写法如下:
from django.http import HttpResponse
def page(request):
h1 = "<h1>这是第一个页面</h1>"
return HttpResponse(html)
在编写完成视图函数后,需要在urls.py的urlpatterns数组中配置相应的url转发,这里需要用到django.urls中的path函数(from django.urls import path)
path函数:path(route, views, name=None)
- route:字符串类型,匹配的请求路径
- views:指定路径对应的视图函数名
- name:为地址起别名,在url反向解析中使用
配置相应的映射:
访问http://127.0.0.1:8000/page1
3. path转换器、re_path()、反向解析
关于path的路径转换器、正则匹配和反向解析,参考django官方文档
URL调度器
4. 请求的方法
常用方式:GET和POST,两种方式均由视图函数统一接收处理,通过request.method来判断具体请求动作。
GET:一般用于向服务器获取数据,获取方法有:
- request.GET[‘参数名’]
- request.GET.get(‘参数名’, ‘默认值’),若不存在,返回默认值
- request.GET.getlist(‘参数名’)
当有数据需要传递给服务器时,通常直接在url中写出,如
http://127.0.0.1:8000/page1?a=100
POST:一般用于向服务器提交数据,例如提交表单数据,也可接收客户端的数据,方法与GET相似
给出一个简单的例子区分GET和POST:
通过网页实现一个计算器,其视图函数如下
def test_mycal(request):
if request.method == 'GET':
return render(request, 'mycal.html')
elif request.method == 'POST':
# 处理计算
x = int(request.POST['x'])
y = int(request.POST['y'])
op = request.POST['op']
result = 0
if op == 'add':
result = x + y
elif op == 'sub':
result = x - y
elif op == 'mul':
result = x * y
else:
result = x / y
return render(request, 'mycal.html', locals())
第一次访问http://127.0.0.1:8000/mycal时,得到的请求为GET,向服务器申请html资源
在填写数据后提交,向服务器提交数据,请求为类型为POST
三、模板层
1. 介绍和配置
模板是可以根据字典数据动态变化的html网页,根据视图传递的字典数据动态生成相应的HTML网页
使用模板要先在于项目名同级的文件夹下新建一个templates目录,并在settings.py中配置TEMPLATES相关项
TEMPLATES = [
{
# 指定模板引擎
'BACKEND': 'django.template.backends.django.DjangoTemplates',
# 模板搜索记录,导入templates目录(实际需要修改)
'DIRS': [os.path.join(BASE_DIR, 'templates')],
# 是否在应用中的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',
],
},
},
]
实际需要修改的部分是DIRS,导入我们新建的templates文件夹
2. 模板的加载方式
模板在视图函数中加载,有一下两种方式:
- 通过loader获取,使用HttpResponse响应
def test_html(request):
# 方案1
from django.template import loader
# 通过loader加载模板
t = loader.get_template('test_html.html')
# 将t转换为HTML字符串
html = t.render()
return HttpResponse(html)
- 使用render()直接加载并相应模板
在视图函数中将python变量封装成字典传递到模板里
def test_html(request):
# 方案2
from django.shortcuts import render
dic = {'username': 'xiaobai', 'age': 18}
return render(request, 'test_html.html', dic)
在模板中可以用{{ 变量名 }}的方式调用视图传递的参数,例如上面传递的username和age,可在test_html.html中调用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试</title>
</head>
<body>
<!--调用视图传递值-->
<h3>{{ username }}是模板层的,年龄是{{age}}岁~~~~</h3>
</body>
</html>
一般情况下使用方式2的较多,并且可以使用locals()方法代替手动封装成字典直接传递,例如:
def base_view(request):
lst = ['Tom', 'Jack']
return render(request, 'base.html', locals())
3. 模板变量与模板标签
模板变量:在2中已使用过,可将变量从视图层传递到模板中,在django中,可以传递的数据类型有一下几种:
- str 字符串
- int 整型
- list 数组
- tuple 元组
- dict 字典
- func 方法
- obj 类实例化对象
对应使用方法有以下几种:
- {{ 变量名 }}
- {{ 变量名.index }} list用法
- {{ 变量名.key }} dict用法
- {{ 对象.方法 }}
- {{ 函数名 }}
模板标签:将服务器段的一些功能嵌入到模板中,例如if判断,for语句等
参考django官方文档
内建标签及过滤器
模板继承:可以使父模板的内容重用,子模板直接继承父模板全部内容,并可以选择覆盖父模板相应块,使用block标签
参考django官方文档
模板继承
四、应用
应用在Django中是一个独立的业务模块,包含自己的路由、视图、模板、模型。
1. 创建应用
manage.py的子命令startapp创建应用文件夹,例如
python manage.py startapp music
其结构与Django初始项目结构基本一致,其中urls.py和templates目录需自行创建,而views.py是已存在的,多出的models.py为模型文件,tests.py为测试文件,migrations目录为数据库迁移文件的目录,使用数据库时要用。
创建应用后,要在settings.py中的INSTALLED_APPS列表中配置此应用,在列表后加入应用music即可
2. 分布式路由
在Django中,主路由配置文件可以不处理用户的具体路由,只做请求的转发,具体路由由各自应用处理,步骤如下:
-
在主路由urls.py中调用include函数,将当前路由转到各个应用的路由配置文件的urlspatterns进行处理
-
应用内部配置模板目录templates,并在settings.py中开启应用模板功能
需要注意的是,应用下templates和外层templates都存在时,Django优先查找外层templates目录下模板,若不存在,再按照INSTALLED_APPS配置下应用顺序逐层查找,而为了避免不同应用下的templates中文件重名,通常在每个应用的templates目录下再建立一个与应用同名的目录作区分:
标签:py,request,视图,Django,学习,html,笔记,django,模板 来源: https://blog.csdn.net/qq_41533576/article/details/116884256
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。