本篇文章要点:
1.Django设计模式与传统的设计模式的区别
2.如何使用模版层的变量和标签来搭建动态html?
3.如何在网页中显示不变的页面部分?(模版层-过滤器和继承)
4.url反向解析的应用
5.静态文件的用法
1.Django的设计模式
在传统的设计模式中使用的是MVC模型,分为model(模型)、view(视图)、controller(控制器)三部分,能有效的降低模块间耦合,各部分含义如下:
- m - 对数据库的封装
- v - 用于向用户展示结果 (什么样数据需要显示?怎样去显示 )
- c - 用于处理请求、回去数据、返回结果(important)
而在django框架中使用的设计模式是MTV模型:
- M-模型层-负责与数据库交互
- T-模版层-负责呈现内容到浏览器(how to display data)
- V-视图层- 负责接收请求、获取数据、返回结果(what)
django中把传统的视图层进行拆分,分为模版层和视图层,而控制层则出现在主路由文件和视图文件的交互之中,在实际应用中可以体会到。下图为django框架的工作模式:
2.模版层-准备
模版就是可以根据视图中传递的字典数据动态变化的html网页
模版层的一般配置
1.创建模版文件夹<项目名>/templates
2.在Settings.py中相关的templates配置
- BACKEND :指定模版引擎
- DIRS:模版的搜索目录(可以是多个)
- APP_DIRS:是否在应用中的templates文件夹中搜索模版文件
- OPTIONS:有关模版的选项
3.需要修改的部分:
'DIRS':[os.path.join(BASE_DIR,'templates')] #拼接路径,BASE_DIR绝对路径
模版的加载方式
1.通过loader获取模版,通过HttpResponse进行响应
#views.py
def test_html(request):
from django.template import loader
t = loader.get_template("test_html.html")
html = t.render()
return HttpResponse(html)
2.使用render()直接加载并响应模版 (更加方便)
#views.py
def test_html(request):
from django.shortcuts import render
return render(request, 'test_html.html')
3.模版层-变量和标签
模版层和视图层之间如何传递变量的?
- 视图函数将python变量封装到字典中传递到模版
- 模版中,用{{变量名}}的语法调用视图传进来的变量
可以传递到模版中的数据类型有字符串、整型、列表、元祖、字典、函数、类实例化对象,有如下几种可以在模版html文件中使用的方式:
{{变量}}、{{变量.index}}、{{变量.key}}、{{对象.方法}}、{{函数名}}
如何使用模版层的标签实现流程控制?
作用:将服务器端的功能嵌到模版中,例如流程控制等。
具体案例
第一步先在views.py中通过上述介绍的render方法写入视图函数:
#views.py
def test_html(request):
from django.shortcuts import render
#dic = {'username':'arlikache', 'age':22}
name = 'arlikache'
age = 22
sex = 'male'
return render(request, 'test_html.html',locals())
其中locals()函数会自动把代码块中变量封装成字典
第二步在urls.py中创建路由映射:
import share.views as shview
path('test/url', shview.test_html),
第三步在模版层templates中创建test_html.html文件写入相应内容:
<html lang = en>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3> 这里是模版层的~~~</h3>
<br>
<p>你好</p>
<p>{{name}}</p>
<!--模版层的标签-->
{%if name == 'arlikache'%}
<p> 验证通过 </p>
{% else %}
<p> 验证失败 </p>
{% endif %}
</body>
</html>
第四步运行python3 manage.py runservser 0:8000,在浏览器中输入url回车后:
4.模版层-过滤器&继承
过滤器
作用: 用过滤器直接在模版层中改变变量的输出显示
常用的几种方法有lower、upper、safe(默认不对变量进行html转义)、add:"n"等
使用方法例如:
<p>{{name|upper}}</p>
模版的继承
可以使父模版的内容重用,子模版可以直接继承父模版的全部内容并可以直接覆盖父模版中相应的块。模版继承时,服务器端的动态内容无法继承(因为没有调用视图文件中的变量,仅仅调用相应的html文件)
可以使用{%block 名称%} 内容{endblock (名称,可有可无)%}这样的django特有的标签来表示子模版可以修改的内容;在子模版中使用{%extends '父模版.html'%}来继承,再使用相同语法来重写,下面案例中有体现。
具体案例如下:
先在templates模版层中创建三个html文件base.html、music.html和sport.html:
<!--base.html-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
{% block mysite %}
<title>主页</title>
{% endblock %}
</head>
<body>
<a href="/music_index">音乐频道</a>
<a href="/sport_index">体育频道</a>
<br>
{% block info %}
这是主页
{% endblock %}
<br>
<h2>有任何问题请联系xxx</h2>
</body>
</html>
<!--music.html-->
{% extends 'base.html' %}
{% block mysite %}
<title> 音乐频道 </title>
{% endblock %}
{% block info %}
欢迎来到音乐频道
{% endblock %}
<!--sport.html-->
{% extends 'base.html' %}
{% block mysite %}
<title> 体育频道 </title>
{% endblock %}
{% block info %}
欢迎来到体育频道
{% endblock %}
模仿第一个案例配置好路由和视图后,在浏览器打开:
再点击音乐频道的超链接,会显示如下结果,实际应用中可以使网站的一部分内容不变,如广告位:
5.url反向解析
url反向解析是指在视图或模版中,用path定义的名称来动态查找或计算出相应的路由
url可以出现的位置:模版和视图函数中
- 模版中:
1.<a href='url'> 超链接</a>
2.<form action='url' method='post'> form表单中的数据 用 post方法提交至url
- 视图函数中:
return HttpResponseRedirect('url') 304跳转
url书写规范:
绝对地址:
- 直接写全,如('http://127.0.0.1/page/1')
相对地址:
- 写法1('/page/1'):浏览器会把当前页面地址栏中的协议,ip和端口加上该地址作为最终访问地址。
- 写法2('page/1'):当前地址栏去掉最后一个/后内容+page/1
url反向解析的写法:
- 在模版函数中使用:
{%url '别名'%}
ex:
{% base %}
{% url 'pagen' '400' %}
{% url 'person' age='18'%}
#urls.py
#创建别名
path('base_index', shview.base_view, name='base')
使用url反向解析在模版中通过‘’别名‘’快速访问url,通过转换器自动填充url
好处:不管怎么改变超链接的url,都能访问到修改后的url
- 在视图中使用:
使用方法:reverse()函数
实现原理:在响应头中Location标记要跳转的目的URL
语法:reverse('别名', args=[], kwargs={}) |
---|
示例:print(reverse('pagen',args=[300])) |
print(reverse('person', kwargs={'name':'xixi','age'=18}) |
# views.py
def test_url_result(request,age):
# html = '<h3>test url is ok</h3>'
# return HttpResponse(html)
from django.urls import reverse
url = reverse('base_index')
return HttpResponseRedirect(url)
6.静态文件的配置&加载
在settings.py中配置[默认存在]
- STATIC_URL = '/static/'
- STATICFILES_DIRS=(os.path.join(BASE_DIR, "static"),) 静态文件在服务器端的存储位置
与templates文件夹同级目录下创建static文件夹,在其中放入静态资源,如下示例中放入了图片,然后在templates模版文件中创建test_static.html文件,如下:
<head>
<meta charset='UTF-8'>
<title>测试静态文件</title>
</head>
<body>
<img src="/static/image/小瞞.png" width='200px',height='200px'>
{% load static %}
<img src= "{% static 'image/小瞞.png'%}" width='200px',height='200px'>
</body>
其中有三种加载方式:绝对路径、相对路径和使用{%load static%}方法加载, 只有使用{%load static %}会动态改变src。
最终效果如下:
课程地址:2021最新版Django全套视频(django框架快速上手)_Python全栈_哔哩哔哩_bilibili