Django框架详细介绍---模板系统

Django模板系统

  官方文档:css

https://docs.djangoproject.com/en/2.0/ref/templates/builtins/#std:templatetag-for

 1.常见语法html

  两种页数符号python

{{}} {% %}

   1)变量django

  变量名由字母、数字、下划线组成;模板语言中用点“.”来获取相应的属性bootstrap

{{变量名}}

   模板支持的写法:安全

{# 取列表中的的第x个参数 #}
{{ 列表.x }} {# 取字典中key的值 #}
{{ 字典.key }} {# 取对象的属性和不带参数的方法 #}
{{ 对象.属性 }} {{ 对象.方法 }}

示例:app

def test(request): class Info(object): def __init__(self, name, pwd): self.name = name self.pwd = pwd def show_info(self): return "用户名:{},密码:{}".format(self.name, self.pwd) info = Info('ch', '123') name = 'zhzh' list_re = ['zhang', '123'] dic_re = {'name': 'zh', 'pwd': '321'} import datetime date = datetime.datetime.today() return render(request, 'test.html', { 'name': name, 'dic': dic_re, 'list': list_re, 'obj': info, 'date': date, 'message': ''' 再没听到你 对我说你最爱的故事 我想了好久 我开始慌了 是否是我又作错了什么 你哭着对我说 童话里都是骗人的 我不多是你的王子 也许你不会懂 从你说爱我之后 个人天空星星都亮了 我愿变成童话里 你爱的那个天使 张开双手变成翅膀守护你 你要相信 相信咱们会像童话故事里 幸福和快乐是结局 一块儿写咱们的结局 你哭着对我说 童话里都是骗人的 我不多是你的王子 也许你不会懂 从你说爱我之后 个人天空星星都亮了 我愿变成童话里 你爱的那个天使 张开双手变成翅膀守护你 你要相信 相信咱们会像童话故事里 幸福和快乐是结局 我要变成童话里 你爱的那个天使 张开双手变成翅膀守护你 你要相信 相信咱们会像童话故事里 幸福和快乐是结局 我会变成童话里 你爱的那个天使 张开双手变成翅膀守护你 你要相信 相信咱们会像童话故事里 幸福和快乐是结局 一块儿写咱们的结局 ''' })
视图
<div class="container">
    <div class="row col-sm4 col-sm-offset-3">
        <div class="col-sm-6">
            <hr> 变量 <br> {{ name }} <hr> 字典,按key取值 <br> {{ dic.name }},{{ dic.pwd }} <hr> 列表,按索引取值,字典后面调用方法求长度 <br> {{ list.0 }},{{ list.1 }},{{ list|length }} <hr> 对象,经过点.访问对象的属性和方法 <br> {{ obj.name }},{{ obj.pwd }},{{ obj.show_info }} <hr> 字符串显示,设置当字符串超出多少个字符以后以省略号的形式显示 <br> {{ message|truncatechars:200 }} <hr> 时间对象,格式化时间显示 <br> {{ date|date:"Y-m-d H:i:s" }} <hr > 字符串显示和防止xml注入,加入safe参数可执行字符串中的脚本 <br> {{ str|safe }} </div>
    </div>
</div>
示例代码

  2)Filterside

  基本语法函数

{{ value|filter_name:参数 }}

  default,默认值oop

{{ value|default: "nothing"}}

注意:

  若是value没有值传则显示nothing

  length,求长度,如求列表的长度

{{ value|length }}

  filesizeformat,将值格式化成一个‘人可读的’文件尺寸

{{ value|filesizeformat }}

  slice,切片,顾头不顾尾

{{value|slice:"首:尾"}}

  date,格式化

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

  safe

  Django的模板中会对HTML标签和JS等语法标签进行自动转义,缘由显而易见,这样是为了安全。可是有的时候可能不但愿这些HTML元素被转义,好比作一个内容管理系统,后台添加的文章中是通过修饰的,这些修饰多是经过一个相似于FCKeditor编辑加注了HTML修饰符的文本,若是自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,若是是一个单独的变量咱们能够经过过滤器“|safe”的方式告诉Django这段代码是安全的没必要转义

{{ str|safe }}

  truncatechars,若是字符串字符个数超出了指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾

{{ message|truncatechars:200 }}

  自定义filter,只带一个或两个参数的Python函数

变量(输入)的值 - -不必定是一个字符串 参数的值 - 这能够有一个默认值,或彻底省略 例如:
  在过滤器{{var | foo:“bar”}}中,过滤器foo将传递变量var和参数“bar”

  步骤:

    I)在创建的APP内新建一个 templatetags 包(python package)

    II)在新建的包内新建一个py文件

    III)py文件内定义实现具体功能的函数,按照固定的写法将其注册到Django的模板语言

    IV)重启Django服务

    V)在HTML中调用

      导入新建的py文件,在调用相关的filter函数

  自定义simpletag,与自定义filter相似,只不过接收更灵活的参数

注册和定义: @register.simple_tag(name="plus") def plus(a, b, c): return "{} + {} + {}".format(a, b, c) 导入使用: {% load py文件 %} {% plus "1" "2" "abc" %}

  inclusion_tag,多用于返回HTML代码

示例:

from django import template # 生成一个用于注册自定义的filter方法的实例
register = template.Library() @register.filter(name='str_sum') def str_sum(str_1, str_2): return "{} {}".format(str_1, str_2) @register.inclusion_tag('ul.html', name='wapper') def my_menu(arg): ret = ["第{}项".format(i) for i in range(arg)] return {'data': ret}
自定义filter函数
<div class="col-sm-6"> {% load filter_test %} <hr> {#调用filter内定义的函数#} {{ name|str_sum:"vary happy" }} <hr> 注册方法:@register.inclusion_tag('ul.html',name='wapper') <br> 调用 和 传参数 {% wapper 10 %} </div>
调用自定义filter
<ul> {% for i in data %} <li>{{ i }}</li> {% endfor %} </ul>
ul.html

  3)Tags

   for循环

示例:循环列表

{% for user in user_list %} <li>{{ user.name }}</li> {% endfor %} </ul>

  for循环相关参数

forloop.counter     当前循环的索引值(从1开始) forloop.counter0     当前循环的索引值(从0开始) forloop.revcounter 当前循环的倒序索引值(从1开始) forloop.revcounter0 当前循环的倒序索引值(从0开始) forloop.first 当前循环是否是第一次循环(布尔值) forloop.last 当前循环是否是最后一次循环(布尔值) forloop.parentloop 本层循环的外层循环

   for ... empty

<ul> {% for user in user_list %} <li>{{ user.name }}</li> {% empty %} <li>循环为空时执行这里的语句</li> {% endfor %} </ul>

   if,elif 和 else条件语句

{% if a %} <div>知足条件一执行</div> {% elif b %} <div>知足条件二执行</div> {% else %} <div>不知足前面的条件执行</div> {% endif %}
{% if a %} <div>知足条件执行</div> {% else %} <div>不知足条件执行</div> {% endif %} 

  with,定义中间变量

{% with total=business.employees.count %} {{ total }} employee{{ total|pluralize }} {% endwith %}

  csrf_token,跨站请求伪造保护

在页面的form表单里面写上{% csrf_token %}
<form action="/app/upload_file/" method="post" enctype="multipart/form-data"> {# 引入csrf_token,防止跨站请求伪造#}
      {% csrf_token %} ....... </form>

补充:   

  1)if 判断支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断,可是Django中不支持连续判断,例如:不支持if a>b>c等写法

  2)Django模板语言中属性的优先级大于方法

2.母板

  继承母板,在子页面中页面最上方导入母板

{% extends '母版HTML文件' %}

  块,经过在母板中定义块,在子页面中经过定义母板中的block名来替换模板中相应的内容

{% block page-test %} HTMl代码   {% endblock %}

  组件,将经常使用的页面内容保存在单独的文件中如导航条、页尾信息,而后在须要使用的地方导入

{% include '组件HTML文件' %}

  静态文件相关

{% load static %} <img src="{% static "images/pic.jpg" %}" alt="图片加载失败" />

示例:修改setting.py中的static路径

# STATIC_URL = '/static/' STATIC_URL = '/333/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), ]

  导入静态文件(CSS、JS等文件时经过静态文件)

{# 静态文件,提升拓展性#} {#<link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css">#} {% load static %} <link rel="stylesheet" href="{% static 'bootstrap-3.3.7/css/bootstrap.min.css' %}">
<link rel="stylesheet" href="{% static 'font-awesome-4.7.0/css/font-awesome.min.css' %}">

  引用JS文件,以及当在多个地方被引用是可起别名,至关于保存为一个变量

{% load static %} {% static "images/pic.jpg" as mytest %} <img src="{{ mytest }}"></img>

  使用get_static_prefix

{% load static %} <img src="{% get_static_prefix %}images/pic.jpg" alt="图片加载失败" />

  或者起别名

{% load static %} {% get_static_prefix as STATIC_PREFIX %} <img src="{{ STATIC_PREFIX }}images/pic.jpg" alt="图片加载失败" />
相关文章
相关标签/搜索