django模板templates详解(二)
程序员文章站
2022-07-07 23:10:45
1 总体结构 Django是MTV结构,即:Model, Template, View Model:定义数据的存储格式,并且提供了数据库访问的API。 View:定义那些数据被显示,是业务逻辑处理模块。 Template:定义数据如何被显示。 Django工程包含工程的配置、及多个APP,每个A ......
1 总体结构
Django是MTV结构,即:Model, Template, View
Model:定义数据的存储格式,并且提供了数据库访问的API。
View:定义那些数据被显示,是业务逻辑处理模块。
Template:定义数据如何被显示。
Django工程包含工程的配置、及多个APP,每个APP完成相对独立的功能。在设计中,要尽量保持每个APP的独立性,以做到APP是即插即用。
2 各个模块的交互关系
Django收到HTTP请求后,依次完成下列处理:
根据URL通过URLConf模块映射到View函数,将HttpRequest对象作为参数传入。
在View函数中,获取HTTP请求的参数,通过Model访问数据库,进行业务逻辑运算得到输出数据。
然后,加载Template,根据输出数据生成页面,将HttpResponse对象返回。
3 模板概述
#模板处理过程: 1. 模板加载 2. 模板渲染 #模板包含两个部分: 3. 原始的html⻚⾯ 4. 模板语法标记的内容(标记语言) #模板引擎就是把模板语法标记的内容,替换成导⼊到模板引擎的数据 render(request, 模板名称,传递给模板渲染的字典) render返回的是HttpResponse对象 render的中间结果就是⼀个字符串,然后⽤该字符串创建HttpResponse对象
4 定义模板
(1)变量 语法:{{变量名}} {{ var }} 字典查询{{'student':students}} 属性与方法{{stu.sname}} (2)标签 语法: {%tag%} 标签 格式:if语句 {% if 表达式1 %} 语句1 {% elif表达式2 %} 语句2 {% endif %} 格式:for语句 格式{% for 变量 in 列表 %} 语句1 {% empty %} #当列表为空或不存在时执行语句2 语句2 {% endfor %} (3)comment 多行注释 {% comment %} 注释内容 {% endcomment %} 多行注释 (4)ifqual/ifnotequal 判断是否相等 作用 : 判断是否相等或者不相等 格式 : {% ifequal 值1 值2 %} #如果值1=值2则执行 {% endifequal %} (5) 其他功能 include 作用 : 加载模板并以标签内的参数渲染 格式 : {% include '模板目录' 参数1 参数2%} url作用反向解析格式 : {% url 'namespace:name' p1 p2 %} csrf_token作用: 用于跨站请求伪造保护 格式: {% csrf_token %} block/extends作用 : 用于模板的继承 autoescape: 作用用于html的转义
循环forloop常见的功能:
循环类型 | 说明 |
---|---|
{{ forloop.counter0}} | 表示当前是第⼏次循环,从0数数 |
{{ forloop.revcounter}} | 表示当前是第⼏次循环,倒着数数,到1停 |
{{ forloop.revcounter0}} | 表示当前第⼏次循环,倒着数,到0停 |
{{ forloop.last }} | 布尔值是否是最后⼀个 布尔值 |
{{ forloop.first }} | 是否是第⼀个 |
{{ forloop.counter }} | 表示当前是第⼏次循环,从1数数 |
#例子 data={“values”:range(10)} {% for value in values %} {{value}}//forloop.count {{forloop.count}} {% endfor %}
5 过滤器
1 语法 {{ var过滤器 }} 作用 在变量被显示前修改它 {{ str | upper}} 2 过滤器可以传递参数,参数用引号引起 join 格式 列表|join:'#' {{list|join:'#'}} 列表数据以#号连接 3 如果一个变量没有被提供,或者值为false/空,可以使用默认值 default 格式 {{var|default:'值'}} 实例 {{test|default:'没有'}} 没有默认显示没有 4 根据给定格式转换日期为字符串 date 格式 {{ dateVal|date:'y-m-d' }} 5 HTML转义 escape 6 加减乘除 {{num|add:10}} {{num|add:-5}} {% widthratio num 1 5%}} 计算方法num/1*5 {% widthratio num 2 1%} 计算方法num/2*1
6 反向解析
#urls.py根路由 urlpatterns = [ url(r'^sunck/',include('myApp.urls',namespace='app')) ] #myApp urls.py urlpatterns = [ url(r'^good/(\d+)/(\d+)/$',views.good,name='good'), ] #index.html <a href=' '> <a href='{% url 'app:good' 1 2 %}'> 第一页 下第二条
7 模板继承
1 作用 模板继承可以减少页面的重复,父模板base.html 2 block标签 在父模版中预留区域,子模板去填充 {% block 标签名 %} 3 子模板填充 {% endblock 标签名 %} extends标签 继承模板,需要写在模板文件的第一行 {% extends '父模板路径' %} {% extends 'myApp/base.html' %} 引入父模板路径 #4 实例 base.html 定义父模板 <div id='main'> {% block main %} {% endblock main%} <hr/> {% block main2 %} {% endblock main2 %} </div> # main.html 定义子模板 {% entends 'myApp/base.html' %} {% block mian %} <h1>sunck is a good man<h1/> {% endblock main %} {% block mian2%} <h1>kaige is a good man<h1/> {% endblock main %}
8 HTML转义
HTML转义 作用将受到的字符串当成HTML代码渲染 转义 单个转义 {{ <h1>sunck is a good man</h1>|safe }} 多个转义 {% autoescape off %} {{<h1>sunck is a good man</h1>}} {% endautoescape %}
9 CSRF验证
CSRF 跨站请求伪造 防护恶意网站:链接,表单,按钮,利用登录用户在浏览器中认证从而攻击服务 防止CSRF 在settings中启用 表单过验证 {{crsf_token}} 在view.py中引入 from django.views.decorators.csrf import csrf_exempt 在对应的提交函数中 添加@csrf_exempt #附中间件模块 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
10 静态资源的访问
1. ⼯程下建⽴static⽂件夹 2. settings⾥⾯设置 STATICFILES_DIRS=[os.path.join(BASE_DIR,’static’)] 3. 在模板中可以直接使⽤{% load static %} <link href=“{% static 资源位置 %}“> 模板中去访问静态资源 4. 加载静态资源模块 5. src=“{% static 资源位置 %}”URL配置 r’/index/(?P<page_id>\d+)/(?P<anchor>\w+)’ re.findall(r’/index/(?P<page_id>\d+)/(?P<anchor>\w+)’,’/index/12341234/ asdfSDADH,.14387,./,') 处理函数使⽤固定位置来接收参数