模板

模板

作为Web框架,Django提供了模板,用于编写html代码,还可以嵌入模板代码更快更方便的完成页面开发,再通过在视图中渲染模板,将生成最终的html字符串返回给客户端浏览器。模版致力于表达外观,而不是程序逻辑。模板的设计实现了业务逻辑view与显示内容template的分离,一个视图可以使用任意一个模板,一个模板可以供多个视图使用。

模板包含两部分:

静态部分,包含html、css、js。

动态部分,就是模板语言。

Django模板语言,简写DTL,定义在django.template包中。 创建项目后,在"项目名称/settings.py"文件中定义了关于模板的配置。


views.py中

from django.shortcuts import render

ef runoob(request):
  # 字符串
  views_name = "python教程"
  # 列表
  views_list = ["教程1","教程2","教程3"]
  # 字典
  views_dict = {"name":"教程"}
   views_dict = {"name":"[教程1','教程2','教程3']"}
  return  render(request,"runood.html", {"name":views_name,"views_list":views_list,"views_dict":views_dict})

runood.html

<p>{{ name }}</p>
<p>{{ views_list }}</p>   # 取出整个列表
<p>{{ views_list.0 }}</p> # 取出列表的第一个元素
<p>{{ views_dict }}</p>
<p>{{ views_dict.name }}</p>

过滤器

模板语法:

{{ 变量名 | 过滤器:可选参数 }}
模板过滤器可以在变量被显示前修改它,过滤器使用管道字符

过滤管道可以被* 套接* ,既是说,一个过滤器管道的输出又可以作为下一个管道的输入:

{{ my_list|first|upper }}  将第一个元素并将其转化为大写。
|safe 可以将乱码转化为字符串进行显示

length

返回对象的长度,适用于字符串和列表。

字典返回的是键值对的数量,集合返回的是去重后的长度。

{{ name|length}}

filesizeformat

以更易读的方式显示文件的大小(即'13 KB', '4.1 MB', '102 bytes'等)。

字典返回的是键值对的数量,集合返回的是去重后的长度

from django.shortcuts import render

def runoob(request):
    num=1024
    return render(request, "runoob.html", {"num": num})
    
    
{{ num|filesizeformat}}    

date

根据给定格式对一个日期变量进行格式化。

格式 Y-m-d H:i:s返回 年-月-日 小时:分钟:秒 的格式时间。

 **from** django.shortcuts **import** render

**def** runoob(request):
  **import** datetime
  now  =datetime.datetime.now()
  **return** render(request, "runoob.html", {"time": now}) 

 {{ time|date:"Y-m-d" }} 

模板标签

if/else 标签
基本语法格式如下:

{% if num1 > 20 %}
{{ num1 }}
{% else  %}
no
{% endif  %}
{% for list0 in list1 %}
{{ list0 }}
{% endfor %}




{% if condition %}
     ... display
{% endif %}
或者:

{% if condition1 %}
   ... display 1
{% elif condition2 %}
   ... display 2
{% else %}
   ... display 3
{% endif %}
根据条件判断是否输出。if/else 支持嵌套。

{% if %} 标签接受 and , or 或者 not 关键字来对多个变量做判断 ,或者对变量取反( not ),例如:

{% if athlete_list and coach_list %}
     athletes 和 coaches 变量都是可用的。
{% endif %}
HelloWorld/HelloWorld/views.py 文件代码:
from django.shortcuts import render

def runoob(request):
    views_num = 88
    return render(request, "runoob.html", {"num": views_num})
HelloWorld/templates/runoob.html 文件代码:
{%if num > 90 and num <= 100 %}
优秀
{% elif num > 60 and num <= 90 %}
合格
{% else %}
一边玩去~
{% endif %}
再访问访问 http://127.0.0.1:8000/runoob,可以看到页面:



for 标签
{% for %} 允许我们在一个序列上迭代。

与 Python 的 for 语句的情形类似,循环语法是 for X in Y ,Y 是要迭代的序列而 X 是在每一个特定的循环中使用的变量名称。

每一次循环中,模板系统会渲染在 {% for %} 和 {% endfor %} 之间的所有内容。

例如,给定一个运动员列表 athlete_list 变量,我们可以使用下面的代码来显示这个列表:
<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% endfor %}
</ul>
HelloWorld/HelloWorld/views.py 文件代码:
from django.shortcuts import render

def runoob(request):
    views_list = ["教程","教程1","教程2","教程3",]
    return render(request, "runoob.html", {"views_list": views_list})
HelloWorld/templates/runoob.html 文件代码:
{% for i in views_list %}
{{ i }}
{% endfor %}

模板继承

模板继承和类的继承含义是一样的,主要是为了提高代码重用,减轻开发人员的工作量。

典型应用:网站的头部、尾部信息。
3.1、父模板

如果发现在多个模板中某些内容相同,那就应该把这段内容定义到父模板中。

标签block:用于在父模板中预留区域,留给子模板填充差异性的内容,名字不能相同。 为了更好的可读性,建议给endblock标签写上名字,这个名字与对应的block名字相同。父模板中也可以使用上下文中传递过来的数据。

{%block 名称%}
预留区域,可以编写默认内容,也可以没有默认内容
{%endblock  名称%}
3.2、子模板

标签extends:继承,写在子模板文件的第一行。

{% extends "父模板路径"%}
子模版不用填充父模版中的所有预留区域,如果子模版没有填充,则使用父模版定义的默认值。

填充父模板中指定名称的预留区域。

{%block 名称%}
实际填充内容
{{block.super}}用于获取父模板中block的内容
{%endblock 名称%}

实例

view.py

def temp4(request):
    "模板继承"
    context = {
        'title' : '模板继承',
        'temp1' : '模板1',
        'temp2' : '模板2',
    }

    return render(request,'temp4.html',context=context)

html:

temp3.html用做父模板,temp4.html做子模板

temp3.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{ title }}</title>
</head>
<body>

<h1>-----------网页头部---------</h1>
<hr>
//

{% block quyu1 %}
<p>这个是区域1 请添加内容{{ title }}</p>
<p>这个是区域1 请添加内容{{ temp1 }}</p>
<p>这个是区域1 请添加内容{{ temp2 }}</p>
{% endblock quyu1 %}
<hr>
{% block quyu2 %}
<p>这个是区域2 请添加内容</p>
{% endblock quyu2 %}
<h1>-------------------网页尾部---------------------</h1>
</body>
</html>

temp4.html

{% extends 'temp3.html' %} 
<!-这是继承页面-><!--{-->
<!DOCTYPE html>
<html lang="en">
<head>    <meta charset="UTF-8">   
    <title>Title</title></head>
<body>{% block quyu2%}      
<!--添加预留区域的内容--><a>你好呀</a>
{% endblock quyu2 %}
</body></html>
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在上一章节中我们使用 django.http.HttpResponse() 来输出 "Hello World!"。...
    hiekay阅读 8,184评论 0 1
  • 模板语言包括4种类型,分别是 模板变量 标签 过滤器 注释 模板变量 模板变量的作用是计算并输出,变量名必须由字...
    IT的咸鱼阅读 3,339评论 0 0
  • 官方文档 常用的语法 在DjangoHong Kong只需要记两种特殊符号: {{ }}:变量相关 {% %}: ...
    Pope_Li阅读 5,127评论 0 0
  • Django模板语言 常用语法变量相关的用{{ }}逻辑相关的用{% %} 变量在Django的模板语言使用变量的...
    免跪姓黄阅读 3,089评论 0 3
  • 模板 作为Web框架,Django提供了模板,用于编写html代码,还可以嵌入模板代码更快更方便的完成页面开发,再...
    錦魚阅读 6,765评论 0 0