Django--模板

Posted 490144243msq

tags:

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

1、什么是模板?

  模板就是用于响应的html文件,将页面的设计和Python的代码分离开会更干净简洁更容易维护。 我们可以使用 Django的 模板系统 (Template System)来实现这种模式,这就是本章要具体讨论的问题。

2、模板语法之变量

  在视图函数中用render方法将变量以字典的方式传到模板,之后模板可以用‘变量名‘方式引用变量。

  views:

def index(request):

    name = alex
    age =22
    students = [alex, taibai, nvshen]
    
    return render(request, index.html,name:name, age:age, students:students

  键值对的键名可以自己定 

  templates:

<body>
    <p>姓名 name </p>
    <p>年龄 age 岁</p>
    <p>学生 students.0 </p>  #用这种方式通过索引,提取列表中的某一个元素
    <p>学生 students.1 </p>
</body>

  如果需要传大量的变量,往render中挨个写就不太方便了,所以要用locals()方法,

def index(request):

    name = alex
    age =22
    students = [alex, taibai, nvshen]
    into = name:alex, age: 100, gender: other
    return render(request, index.html, locals())

  这样就可以将所有变量都传进去了。

3、模版之过滤器

  具体格式为变量|过滤器:参数

  default:如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。例如:

<p> book_list1|default:没有符合条件的书籍 </p>

  length:返回值的长度。它对字符串和列表都起作用。例如:

 list|length 

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

 fail_size|filesizeformat 

  date:将时间转换为需要的格式。例如:

  views:

 value=datetime.datetime.now()

  templates:

 value|date:"Y-m-d"  

  也可以是:

 value|date:"Y/m/d"  

  slice:字符串切片。例如:

 value|slice:"2:-1" 

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

  views:

shi = When you are old and grey and full of sleep, And nodding by the fire,take down this book, And slowly read,and dream of the soft look 

  templates:

<p> shi|truncatechars:5 </p>

  结果为:whe...

  注意:...也要占用三个字节的位置。

  safe:Django为了安全,会自动将各种标签转译,但是有时侯我们不惜要他转译,就需要safe了。例如:

  views:(直接导入这个变量,会在界面上生成一个字符串,必须加上safe过滤器,才能生成一个a标签)

link = "<a href= ‘http://www.baidu.com‘>点我</a>"

  templates:

 <p> link|safe </p>

 

4、模板的标签

for标签:遍历每一个元素。例如:

% for person in person_list %
    <p> person.name </p>
% endfor %

  字典也可以。

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

  for标签页游它自己的方法。

  forloop.counter:生成这个元素是第几次循环得到的。

% for book in book_list %
        <li> forloop.counter   book  </li>
    % endfor %

  forloop.counter0:同上,只是变成从0开始。

  forloop.revcounter:反过来

  forloop.revcounter0:反过来从零开始

  forloop.first:判断这个元素是不是第一次循环得到的,是的话显示True。

  forloop.last:判断这个元素是不是最后一次循环得到的,是的话显示False。

for...empty标签:for 标签带有一个可选的empty % 从句,以便在给出的组是空的或者没有被找到时,可以有所操作。

% for person in person_list %
    <p> person.name </p>

% empty %
    <p>sorry,no person here</p>
% endfor %

if标签:if %会对一个变量求值,如果它的值是“True”(存在、不为空、且不是boolean类型的false值),对应的内容块会输出。

% if num > 100 or num < 0 %
    <p>无效</p>
% elif num > 80 and num < 100 %
    <p>优秀</p>
% else %
    <p>凑活吧</p>
% endif %

  for标签中可以套if标签:

% for person in person_list %
    % if person.age > 900 %
        <p> person.name   person.age </p>

    % endif %

% endfor %

with标签:使用一个简单地名字缓存一个复杂的变量,当你需要使用一个方法(比如访问数据库)很多次的时候是非常有用的。

% with name=person_list.2.name  %
    <p> name </p>
    % endwith %

  这样就把person_list.2.name换存在name下了,不用每次都这么复杂的去找。

csrf_token标签:这个标签用于跨站请求伪造保护,即生成一个token,用于用户的认证。

5、模板的继承

  假如我们有多个页面的大致框架都是一样的,只是其中的个别标签不同,我们如果每个页面都将全部的模板编写出来,会有大量的重复代码,所以这个时候,为了代码的简洁,我们可以将这些重复的代码放到一个文件中,供其他模板继承使用,这个文件就称之为母版。

  在母版中,有特定的地方供其他子模板添加标签,被称之为盒子(钩子)--Blocks.

  模板base.html

 <div class="col-md-9">
                % block contend %
                    <h3>welcom</h3>  #子模板中如果没有内容,则返回这里的内容,子模板中如果有内容,则覆盖这里的内容。
                % endblock %
 </div>

  子模板index.html

% extends base.html %


    <div class="jumbotron">
                  <h1>Hello, world!</h1>
                  <p>...</p>
                  <p><a class="btn btn-primary btn-lg" href="#" role="button">Learn more</a></p>
                </div>
% endblock %

  这里用% extends % 标签来告诉系统,他的母版是base.html,系统在访问index.html页面时,回先定向于base.html,注意:% extends % 标签必须在子模板的第一行。

  在母版中可以设置多个盒子,并且越多越好。

  如果你需要同时显示盒子里和子模板中的内容,可以用 block.super 标签,

% extends base.html %


% block contend %
     block.super 

    <div class="jumbotron">
                  <h1>Hello, world!</h1>
                  <p>...</p>
                  <p><a class="btn btn-primary btn-lg" href="#" role="button">Learn more</a></p>
                </div>
% endblock %

  为了更好的可读性,你也可以给你的 % endblock % 标签一个 名字 。例如:

% block content %
...
% endblock content %  

  不能在一个模版中定义多个相同名字的 block 标签。

 

  

 

    

 

 

  

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

怎样在django 模板中只显示前n条记录

Django框架-Django模板(template)系统

Django学习第3篇:Django之模板语法

使用 Django 模板标签的 Mako 模板

模板中的 Django 外键

Django框架之模板层template的一些介绍和使用