zoukankan      html  css  js  c++  java
  • Django之模板

    1.为什么使用模板系统

    Django模板用来分离文档的展现和数据。为什么要分离展现和设计?因为Html页面改动频繁,就必然牵涉到python代码的改动,此外,两者分离会更加高效,减少等待时间。

    模板本质是html文档,但中间有变量{{}}和模板标签{%%}

     2.模板渲染符号

    变量相关的用{{}},逻辑相关的用{%%}

    {{变量名}},包围的是变量,如{{person_name}},表示给定变量值的插入。

    {%tag%},包围的是块标签。如{%if.... %} 它告诉模板做些事情。

     3.变量

    在视图函数中,通过render方法将数据传给templates下的html文件。

    render(request,’’login.html’’,{“变量1”:变量1变量2”:变量2})

    通过字典的形式传值。字典处可以些locals(),代表将所有变量都传过去。测试时可以用,实际不用,而且效率低。传的值包括字典、列表、对象等

    html中,直接写{{变量名}}调用。如果传来的是列表、字典,可以直接用.()的方式+索引(键)来取里面的值。比如{{dict.name}},{{list.0}}。在调用对象里面的方法的时候,不需要写括号来执行,并且只能执行不需要传参数的方法

     4.过滤器

    1)过滤器介绍

    过滤器用途:改变变量的显示。如{{value|filesizeformat}}表示将传来的值格式化一个可读的文件尺寸(如KBMB等)

    过滤器语法:{{ value|filter_name:参数 }}

    |是管道符。参数一般用双引号包裹。比如:{{bio|truncatewords:”30”}}表示显示bio变量的前30个字。

    注意事项:'|'左右没有空格没有空格没有空格。过滤器参数包含空格的话,必须用引号包裹起来。

    2)几个过滤器介绍

    名称

    用法

    解释

    default

    {{ value|default:"null"}}

    如果value没有传值或者值为空的话就显示null

    length

    {{ value|length }}

    返回value的长度

    filesizeformat

    {{ value|filesizeformat }}

    将值格式化为一个 人类可读的文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)

    slice

    {{value|slice:"2:-1"}}

    切片,value="hello world",显示“llo worl”

    date

    {{value|date:"Y-m-d H:i:s"}}

    格式化,如果 value=datetime.datetime.now()

    safe

    {{ value|safe}}

    告诉Django这段代码是安全的不必转义(防止xss攻击,将html元素转义成文本)

    truncatechars

    {{ value|truncatechars:9}

    如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。

    truncatewords

    {{ value|truncatewords:3}}

    在一定数量的字后截断字符串,是截多少个单词。

    cut

    {{ value|cut:值}}

    移除value中所有的与给出的变量相同的字符串

    join

    {{ list|join:”值” }}

    使用字符串连接列表。就像Pythonstr.join(list)

    5.标签

    格式:{% tag%}。告诉模板做些什么事。常用的有{%if %}{%endif%}{%for%}{%endfor%}

    (1){%if %}标签

    {%if%}的布尔值为真的话,就显示{%if%}{%endif%}之间的所有的内容。中间也可以有{%elif%}{%else%}

    if语句支持 and or==><!=<=>=innot inisis not判断,注意条件两边都有空格。

    2{%for%}

    {%for%}允许按顺序遍历序列中的每个元素。每次循环模板系统都会渲染{%for%}{%endfor%}之间的内容。

    {%for%}之间内置一个forloop模板变量,该变量含有一些属性可以提供循环的信息。并且只能在for循环内部使用。

    循环字典:

    {% for key,val in dic.items %}
    
        <p>{{ key }}:{{ val }}</p>
    
    {% endfor %}

    {{forloop}}几个重要的属性:

    forloop.counter            当前循环的索引值(从1开始),forloop是循环器,通过点来使用功能
    
    forloop.counter0           当前循环的索引值(从0开始)
    
    forloop.first              当前循环是不是第一次循环(布尔值)
    
    forloop.last               当前循环是不是最后一次循环(布尔值)

    3{%csrf_token%}

    csrf是跨站请求伪造,csrf_token是用来跨站请求伪造保护。在form表单里面任意位置写上{%csrf_token%},通过浏览器正常访问网页提交数据就可以成功。原因是:在form表单里面任意位置写上{%csrf_token%},模板渲染的时候替换成了<input type="hidden" name="csrfmiddlewaretoken" value="8J4z1wiUEXt0gJSN59dLMnktrXFW0hv7m4d40Mtl37D7vJZfrxLir9L3jSTDjtG8">,在提交数据的时候,请求体中携带了这个随机字符串,后台就可以根据这个验证。

     6.模板继承

    Web开发有个重要的开发问题:如何减少一个常见页面区域的重复和冗余(如全站导航)。解决方式可以有在一个html里嵌套另一个页面。模板继承可以更好解决这个问题。模版继承可以让你创建一个基本的“骨架”模版,它包含您站点中的全部元素(包含网站的通用信息),并且可以定义能够被子模版覆盖的“块”。

    1)母模板

    母模板定义了其他页面使用的基本html框架。使用{%block%}标签告诉模板引擎一个子模版可能在这覆盖内容。

    比如:

    {% block title %}    {% endblock %}
    
     {% block sidebar %}    {% endblock %}
    
    {% block content %}    {% endblock %}

    最好在写成{% endblock  content%},更清晰。

    2)子模版

    子模版来填充母模板中有block的地方。

    方法:首先要写{% extends "base.html" %}base.html是母模板的名称,extends告诉模板引擎这个页面继承了base.html

    其次,在相应的地方替换:

    {% block title %}    替换内容    {% endblock %}
    
    {% block sidebar %}    替换内容    {% endblock %}
    
    {% block content %}    替换内容    {% endblock %}

    注意:

    如果你在模版中使用 {% extends %} 标签,它必须是模版中的第一个标签

    base模版中设置越多的 {% block %} 标签越好。请记住,子模版不必定义全部父模版中的blocks

    {{ block.super }}可以得到母模版中的块内容。

     7.组件

    可以将常用的页面内容如导航条,页尾信息等组件保存在单独的文件中,然后在需要使用的地方,文件的任意位置按如下语法导入即可。

    {% include 'navbar.html' %}

  • 相关阅读:
    24张图,九大数据结构安排得明明白白
    mysql中的mvcc解读
    常见电商项目的数据库表设计(MySQL版)
    两万字深度介绍分布式系统原理,一文入魂
    使用消息中间件时,如何保证消息仅仅被消费一次?
    GCC/G++选项 -Wl,-Bstatic和-Wl,-Bdynamic
    sql 练习
    设计模式-单例模式
    设计模式-抽象工厂模式
    设计模式-工厂方法模式
  • 原文地址:https://www.cnblogs.com/yq055783/p/12337157.html
Copyright © 2011-2022 走看看