Django学习笔记(6)模板

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转义

模板变量值出现一些特殊字符会进行转义:
小于号 &lt;
大于号 &gt;
单引号 &#39;
双引号 &quot;
与符号 &amp;
关闭字符转义:{{模板变量|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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值