Django 模板

Created
Sep 6, 2023 05:22 AM
Date
Jan 1, 2021

1. 模板的功能

产生html,控制页面上展示的内容。模板文件不仅仅是一个html文件。
模板文件包含两部分内容:
  1. 静态内容:css,js,html。
  1. 动态内容:用于动态去产生一些网页内容。通过模板语言来产生。

2. 模板文件的使用

通常是在视图函数中使用模板产生html内容返回给客户端。
  1. 加载模板文件 loader.get_template 获取模板文件的内容,产生一个模板对象。
  1. 定义模板上下文 RequeseContext 给模板文件传递数据。
  1. 模板渲染产生html页面内容 render 用传递的数据替换相应的变量,产生一个替换后的标准的html内容。

3. 模板文件加载顺序

  1. 首先去配置的模板目录下面去找模板文件。
  1. 去INSTALLED_APPS下面的每个应用的templates去找模板文件,前提是应用中必须有templates文件夹。

4. 模板语言

模板语言简称为DTL。(Django Template Language)

4.1 模板变量

模板变量名是由数字,字母,下划线和点组成的,不能以下划线开头。
使用模板变量:{{模板变量名}}
模板变量的解析顺序:
例如:{{ book.btitle }}
  1. 首先把book当成一个字典,把btitle当成键名,进行取值book[‘btitle’]
  1. 把book当成一个对象,把btitle当成属性,进行取值book.btitle
  1. 把book当成一个对象,把btitle当成对象的方法,进行取值book.btitle
  • 例如:{{book.0}}
      1. 首先把book当成一个字典,把0当成键名,进行取值book[0]
      1. 把book当成一个列表,把0当成下标,进行取值book[0]
如果解析失败,则产生内容时用空字符串填充模板变量。
使用模板变量时,.前面的可能是一个字典,可能是一个对象,还可能是一个列表。

4.2 模板标签

{% 代码段 %} for循环: {% for x in 列表 %} # 列表不为空时执行 {% empty %} # 列表为空时执行 {% endfor %} 可以通过{{ forloop.counter }}得到for循环遍历到了第几次。 {% if 条件 %} {% elif 条件 %} {% else %} {% endif %}
关系比较操作符:> < >= <= == !=
注意:进行比较操作时,比较操作符两边必须有空格。
逻辑运算:not and or

4.3 过滤器

过滤器用于对模板变量进行操作。
date:改变日期的显示格式。
length:求长度。字符串,列表.
default:设置模板变量的默认值。
格式:模板变量|过滤器:参数
自定义过滤器。
自定义的过滤器函数,至少有一个参数,最多两个
参考资料:(模板标签和内置过滤器)

4.4 模板注释

单行注释:{# 注释内容 #}
多行注释:
{% comment %} 注释内容 {% endcomment %}

5. 模板继承

模板继承也是为了重用html页面内容。
notion image
在父模板里可以定义块,使用标签:
{% block 块名 %} 块中间可以写内容,也可以不写 {% endblock 块名%}
子模板去继承父模板之后,可以重写父模板中的某一块的内容。
继承格式:{% extends 父模板文件路径%}
{% block 块名 %}
{{ block.super}} #获取父模板中块的默认内容
重写的内容
{% endblock 块名%}

6. html转义

编辑商品详情信息,数据表中保存的是html内容。
在模板上下文中的html标记默认是会被转义的。
小于号< 转换为&lt; 大于号> 转换为&gt; 单引号' 转换为&#39; 双引号" 转换为 &quot; 与符号& 转换为 &amp;
要关闭模板上下文字符串的转义:可以使用 {{ 模板变量|safe}}
{% autoescape off %} 模板语言代码 {% endautoescape %}
模板硬编码中的字符串默认不会经过转义,如果需要转义,那需要手动进行转义。

7. csrf攻击

首先做一个登录页,让用户输入用户名和密码进行登录,登录成功之后跳转的修改密码页面。在修改密码页面输入新密码,点击确认按钮完成密码修改。
登录页需要一个模板文件login.html.修改密码页面也需要一个模板文件change_pwd.html.
显示登录页的视图login,验证登录的视图login_check,显示发帖页的视图change_pwd,处理修改密码的视图change_pwd_action.
加功能:
用户登录之后才可以进行修改密码操作。
登录装饰器函数。
notion image
案例流程图:
notion image
django防止csrf的方式:
  1. 默认打开csrf中间件。
  1. 表单post提交数据时加上{% csrf_token %}标签。
防御原理:
  1. 渲染模板文件时在页面生成一个名字叫做csrfmiddlewaretoken的隐藏域。
  1. 服务器交给浏览器保存一个名字为csrftoken的cookie信息。
  1. 提交表单时,两个值都会发给服务器,服务器进行比对,如果一样,则csrf验证通过,否则失败。

8. 验证码

在用户注册、登录页面,为了防止暴力请求,可以加入验证码功能,如果验证码错误,则不需要继续处理,可以减轻业务服务器、数据库服务器的压力。

9. 反向解析

当某一个url配置的地址发生变化时,页面上使用反向解析生成地址的位置不需要发生变化。
根据url 正则表达式的配置动态的生成url。
在项目urls中包含具体应用的urls文件时指定namespace;
urlpatterns-[ url(r'^admin/',include(admin.site.urls)), # 包含应用的urls文件 url(r'^',include('booktest.urls'),namespace='booktest'), ]
在应用的urls中配置是指定name;
urlpatterns-[ url(r'^index1/$',views.index1,name='index1'), url(r'^index2/$',views.index2,name='index2'), ]
在模板文件中使用时,格式如下: {% url 'namespace名字:name' %} 例如{% url 'booktest:fan2'%}
带位置参数: {% url 'namespace名字:name' 参数 %} 例如{% url 'booktest:fan2' 1%}
带关键字参数: {% url 'namespace名字:name' 关键字参数 %} 例如{% url 'booktest:fan2' id=1 %}
在重定向的时候使用反向解析: from django.core.urlresolvers import reverse
无参数: reverse('namespace名字:name名字')
如果有位置参数 reverse('namespace名字:name名字', args = 位置参数元组)
如果有关键字参数 reverse('namespace名字:name名字', kwargs=字典)