文章目录
1.模板的功能
产生html,控制页面上展示的内容,模板文件包括两部分内容:
- 静态内容:css,js,html
- 动态内容:用于动态地产生一些网页内容,通过模板语言来产生。
2.使用模板文件
- 加载模板文件
去模板目录下面获取html文件的内容,得到一个模板对象 - 定义模板上下文
向模板文件传递数据 - 模板渲染
得到一个标准的html内容 - 返回应答
def index(request):
temp = loader.get_template('booktest003/index.html')
context = RequestContext(request,{})
res_html = temp.render(context)
return HttpResponse(res_html)
使用django封装好的render
def index(request):
return render(request,'booktest003/index.html')
3.模板文件的加载顺序
- 首先去配置的模板目录下面找
- 然后去
INSTALLED_APPS
下面的每个应用里去找模板文件,例如admin/templates/ 、auth/template/,前提是必须有templates文件夹
4.模板语言
模板语言(DTL,Django Template Language)
4.1 模板变量
{{模板变量名}}
4.2 模板标签
{%代码段%}
for循环:
{% for x in 列表%}
{%endfor%}
列表为空是执行:{%empty%}
可以通过{{forloop.counter}}
得到for循环遍历到了第几次
if条件
{{%if 条件%}}
{{%elif 条件%}}
{{%else%}}
{{%endif%}}
比较操作符两边必须有空格
4.3 过滤器
过滤器用于对模板变量进行操作
date
:改变日期的显示格式
length
:求长度。字符串、列表、元组、字典长度
default
:设置模板变量的默认值
格式:模板变量 | 过滤器:参数
<ul>
{% for book in books %}
<li>{{ book.bookTitle }}--{{ book.publish_date | date:"Y-m-d"}}</li>
{% endfor %}
</ul>
<ul>
{% for book in books %}
<li>{{ book.bookTitle }}--{{ book.bookTitle|length }}--{{ book.publish_date | date:"Y-m-d"}}</li>
{% endfor %}
</ul>
自定义过滤器
1.在应用下新建python包,名为templatetags
2.新建python文件,过滤器本质为python函数
至少有一个参数,最多有两个
filters.py
from django.template import Library
register = Library()
@register.filter
def mod(num):
return num%2 == 0
<ul>
{% for book in books %}
{% if book.id|mod %}
<li class="yellow">{{ book.bookTitle }}--{{ book.bookTitle|length }}--{{ book.publish_date | date:"Y-m-d"}}</li>
{% else %}
<li>{{ book.bookTitle }}--{{ book.bookTitle|length }}--{{ book.publish_date | date:"Y-m-d"}}</li>
{% endif %}
{% endfor %}
</ul>
4.4 模板注释
单行注释
{#注释内容#}
多行注释
{% comment %}
{% endcomment %}
5.模板继承
目的:重用模板代码
{% extends 'booktest003/index.html' %}
父模板
继承之后
继承父模板之后,子模板内不能有其他内容,否则不会显示。
要显示跟父模板不同的内容,需要在父模板中预留位置,预留块
{%block 块名%}
{%endblock 块名%}
父模板
<body>
<h1>i am father</h1>
<ul>
{% for book in books %}
{% if book.id|mod %}
<li class="yellow">{{ book.bookTitle }}--{{ book.bookTitle|length }}--{{ book.publish_date | date:"Y-m-d"}}</li>
{% else %}
<li>{{ book.bookTitle }}--{{ book.bookTitle|length }}--{{ book.publish_date | date:"Y-m-d"}}</li>
{% endif %}
{% endfor %}
</ul>
{% block b1 %}
<h2>father block</h2>
{% endblock b1 %}
</body>
子模板
<!DOCTYPE html>
{% extends 'booktest003/index.html' %}
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% block b1 %}
<h2>child block</h2>
{% endblock b1 %}
</body>
</html>
子模板去继承父模板之后,可以重写父模板中某一块的内容。
获取父模板中块的默认内容:{{ block.super }}
{% block b1 %}
{{ block.super }}
<h2>child block</h2>
{% endblock b1 %}
6.html转义
模板变量值出现一些特殊字符会进行转义:
小于号 <
大于号 >
单引号 '
双引号 "
与符号 &
关闭字符转义:{{模板变量|safe}}
也可以使用:
{% autoescape off %}
模板代码语言
{% endautoescape %}
模板硬编码中的字符默认不会经过转义。
7.csrf攻击
登录正常网站之后,本机浏览器保存了sessionid,并且没有退出,此时用户若意外访问了另一个网站,并且点击了页面上的按钮。(跨站访问伪造)
django默认开始了csrf中间件,
表单post提交数据时加上{% csrf_token%}标签。
防御原理:
(1)渲染模板文件时在页面生成一个名字叫做csrfmiddlewaretoken的隐藏域。
(2)服务器交给浏览器保存一个名字为csrftoken的cookie信息。
(3)提交表单时,两个值都会发给服务器,服务器进行比对,如果一样,则csrf验证通过,否则失败。
8.验证码
9.反向解析
项目urls.py
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^', include('booktest002.urls',namespace='booktest002')),
]
urlpatterns = [
url(r'^index$', views.index,name='index'),
]
<body>
index link:
<a href="/index">index</a><br/>
url reverse link:
<a href="{% url 'booktest002:index' %}">reverse link</a>
</body>
带有参数捕获的情况:
urlpatterns = [
url(r'^show_args/(\d+)/(\d+)$',views.show_args,name="show_args")
]
<body>
index link<br/>
<a href="/index">index</a><br/>
url reverse link:<br/>
<a href="{% url 'booktest002:index' %}">reverse link</a><br/>
show:args:<br/>
<a href="/show_args/1/2">/show_args/1/2</a><br/>
dongtai shengcheng:<br/>
<a href="{% url 'booktest002:show_args' 1 2 %}">/show_args/1/2</a><br/>
</body>
关键字参数:
url(r'^show_kwargs/(?P<c>\d+)/(?P<d>\d+)$',views.show_kwargs,name="show_kwargs")
show keywords args:<br/>
<a href="/show_kwargs/3/4">/show_kwargs/3/4</a><br/>
dongtaishengcheng keywords args:
<a href="{% url 'booktest002:show_kwargs' c=3 d=4 %}">/show_kwargs/3/4</a><br/>
在重定向时使用反向解析
from django.core.urlresolvers import reverse
def test_redriect(request):
url = reverse('booktest002:index')
#url = reverse('booktest002:show_args',args=(1,2))
#url = reverse('booktest002:show_kwargs', kwargs={'c':3,'d':4})
return redirect(url)