Django之模板层

Posted asdaa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django之模板层相关的知识,希望对你有一定的参考价值。

常用语法

只需要记两种特殊符号就行了

跟变量相关

跟逻辑相关%%

Django模板语法取值时都是通过点方法取值

 author_obj.pk 

如果后端传入一个列表过来,我们也可以通过点方法取出列表中的值

% for book_all in book_all_list %
            <tr>
                <td>book_all.0.title</td>
                <td> book_all.0.price </td>
                <td> book_all.1 </td>
                <td> book_all.2 </td>
                <td>
                    <a href="% url ‘delete_book‘ book_all.0.pk %" class="btn btn-danger">删除</a>
                    <a href="% url ‘update_book‘ book_all.0.pk %" class="btn btn-primary">编辑</a>
                </td>
            </tr>
        % endfor %

过滤器(Filters)

在Django的模板语言中,通过使用 过滤器 来改变变量的显示。

过滤器的语法: value|filter_name:参数

使用管道符"|"来应用过滤器。

例如: name|lower 会将name变量应用lower过滤器之后再显示它的值。lower在这里的作用是将文本全都变成小写。

注意事项:

  1. 过滤器支持“链式”操作。即一个过滤器的输出作为另一个过滤器的输入。
  2. 过滤器可以接受参数,例如: sss|truncatewords:30 ,这将显示sss的前30个词。
  3. 过滤器参数包含空格的话,必须用引号包裹起来。比如使用逗号和空格去连接一个列表中的元素,如: list|join:‘, ‘
  4. ‘|‘左右没有空格没有空格没有空格
 index 

如果把函数作为变量,前端会打印函数的返回值,但是函数无法传值

length

 l|length 

可以统计容器类型长度,但不能统计数字类型

 

default

 f|default:‘你是真的蠢‘ 

如果f变量值为False,或者为空,f的值为default后面的值

 

filesizeformat

 n|filesizeformat 

在前端打印的是文件大小形式

技术图片

 

 

 

truncatechars

 s|truncatechars:3 

truncatechars后面跟的是3的话,只会打印3个小数点,

比如truncatechars:x会在前端x个字符,但是会打印三个小数点,所以打印的真正文本就x-3

truncatewords

 s|truncatewords:3 

技术图片

 

 

 

truncatewords与truncatechars不同

truncatewords后面的3,表示的是以文本中三个空格隔开数据,但是后面也会跟三个小数点

date

格式化时间,我们先从后端传一个时间对象过来

 ctime|date:‘Y-m-d‘ 

技术图片

 

 

 一般情况用到年月日就可以了

 ctime|date:‘Y-m-d H-i-s‘ 

显示年月日时分秒

技术图片

 

 

 safe

如果我们后端写了前端代码,反到前端,只会是一串字符串,不会是html代码,这是为了脚本攻击,我们也可以通过safe方法和mark_safe解决

使用这两个方法,就可以让前端使用后端传来的html代码

技术图片

 

 

 后端使用mark_safe标记这段html代码是安全的,作为一个全栈开发工程师,这个还是要了解的

技术图片

 

 

 技术图片

 

 

 我们也可以像这样使用safe,从后端返回一个html代码的字符串,在html文件中使用safe方法

cut

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

 value|cut:‘ ‘ 

如果value为‘i love you‘,那么将输出‘iloveyou‘.

join

使用字符串连接列表,例如Python的str.join(list)

timesince

将日期格式设为自该日期起的时间(例如,“4天,6小时”)。

采用一个可选参数,它是一个包含用作比较点的日期的变量(不带参数,比较点为现在)。 例如,如果blog_date是表示2006年6月1日午夜的日期实例,并且comment_date是2006年6月1日08:00的日期实例,则以下将返回“8小时”:

 blog_date|timesince:comment_date 

分钟是所使用的最小单位,对于相对于比较点的未来的任何日期,将返回“0分钟”。

timeuntil

似于timesince,除了它测量从现在开始直到给定日期或日期时间的时间。 例如,如果今天是2006年6月1日,而conference_date是保留2006年6月29日的日期实例,则 conference_date | timeuntil 将返回“4周”。

使用可选参数,它是一个包含用作比较点的日期(而不是现在)的变量。 如果from_date包含2006年6月22日,则以下内容将返回“1周”:

 conference_date|timeuntil:from_date 

slice

切片

value|slice:"2:-1"

可以支持步长

标签

              #% for foo in l %#
                    #    <p> forloop </p>#
                    #% endfor %#
                    ##
                    ##
                    #% if ‘xxx‘ %#
                    #<p>xxx条件为true</p>#
                    #    % else %#
                    #    <p>xxx条件为false</p>#
                    #% endif %#

                    ##
                    #% for foo in l %#
                    #    % if forloop.first %#
                    #        <p>这是我的第一次</p>#
                    #        % elif forloop.last %#
                    #        <p>这是最后一次了啊</p>#
                    #        % else %#
                    #        <p>来啊来啊!!!</p>#
                    #    % endif %#
                    #    % empty %#
                    #    <p>当for循环的对象为空的时候 会走empty</p>#
                    #% endfor %#

                    ##
                    #<p>#
                    #    django模板语法在取值的时候 统一使用句点符(大白话就是 点号   .)#
                    #    % with l.6.3.name as ttt %  可以给一个比较复杂的取值操作取一个别名 之后在with语句中 就可以使用该别名#
                    #         ttt #
                    #         l.6.3.name #
                    #    % endwith %#
                    #</p>#


                    % for foo in d.keys %
                        <p> foo </p>
                    % endfor %
                    % for foo in d.values %
                        <p> foo </p>
                    % endfor %
                    % for foo in d.items %
                        <p> foo </p>
                    % endfor %
            
                for循环里面的forloop对象
                if判断

 

自定义标签 过滤器 inclusion_tag


  自定义固定的三步走战略:
  1.必须在你的应用下新建一个名为templatetags文件夹
  2.在该文件夹内新建一个任意名称的py文件
  3.在该py文件中固定先写下面两句代码

from  django import template
                        
register = template.Library()
# 自定义一个简易版本|add过滤器
@register.filter(name=add)
def index(a, b):
    try:
        return int(a) + int(b)
    except BaseException:
        return str(a) + str(b)

在模板层如何使用自定义过滤器呢?

技术图片

 

 在模板层加载templatetags文件夹下的自定义py文件

就可以使用自定义过滤器了

自定义标签

simple_tag

# 自定义标签
@register.simple_tag(name=tank)
def index(a, s, d, f, year):
    return a+s+d+f+year

在模板层使用

% load mybaby %
%tank 1 2 3 4 year=5 %

支持关键字传参

inclusion_tag

app01/templatetags/mybaby.py

技术图片

 

 

template/111.html

技术图片

 

 template/test.html

技术图片

 

 

inclusion_tag就是我们先在mybaby中定义inclusion_tag,然后在test.html文件调用的时候,我们去111.html文件中产生一小块html代码,然后直接拿到test.html中使用

"""
接收用户传入的参数 然后作用于一个html页面
在该页面上渲染数据 之后将渲染好的页面
放到用户调用inclusion_tag的地方
"""

模板的继承
当多个页面整体的样式都大差不差的情况下 可以设置一个模板文件
在该模板文件中 使用block块划分多个预期
之后子版在使用模板的时候 可以通过block块的名字 来选定到底需要修改哪一部分区域

模板一般情况下 应该至少有三个可以被修改的区域
% block css %
子页面自己的css代码
% endblock %


% block content %
子页面自己的html代码
% endblock %


% block js %
子页面自己的js代码
% endblock %



# 模板的继承 使用方式
% extends ‘home.html‘ %

% block css %
<style>
h1
color: red;

</style>
% endblock %

 

% block content %
<h1>登陆页面</h1>
<form action="">
<p>username:<input type="text" class="form-control"></p>
<p>password:<input type="text" class="form-control"></p>
<input type="submit" class="btn btn-danger">
</form>
% endblock %


% block js %

% endblock %


# 一般情况下 模板上的block越多 页面的可扩展性就越强



模板的导入
% include ‘beautiful.html‘ %


当你写了一个特别好看的form表单/列表标签等
可以将它当成一个模块 哪个地方需要 就直接导入使用即可

 

以上是关于Django之模板层的主要内容,如果未能解决你的问题,请参考以下文章

[Django框架之模板层]

Django之模板层

Django基础之视图(views)层模板层

Django之模板层

Django之模板层

Django之模板层