Django框架详解之template

Stella981
• 阅读 721

模板简介

  将页面的设计和python的代码分离开会更干净简洁更容易维护。我们可以使用Django的模板系统来实现这种模式

  python的模板:HTML代码+模板语法

  模板包括在使用时会被值替换掉的变量,和控制模板逻辑的标签

变量

  在Django模板中遍历复杂数据结构的关键是句点字符

{#语法#}   {{ var_name }}

  views

def index(request):
    import datetime
    s='hello'
    l=[1,2,3]
    dic={"name":'lary',"age":18}
    date = datetime.date(2000,3,12)

    class Person(object):
        def __init__(self,name):
            self.name = name

    person_l=Person("lily")
    person_j=Person('jerry')
    person_t=Person('tom')

    person_li=[person_l, person_j, person_t]

    return render(request,'index.html',{"l":l,"dic":dic,"date":date,"person_list":person_li,"s":s})

  template

<body>
<h4>{{ s }}</h4>
<h4>{{ l.0 }}</h4>
<h4>{{ dic.name }}</h4>
<h4>{{ date.year }}</h4>
<h4>{{ person_list.0.name}}</h4>
{#句点符也可以用来引用对象的方法(无参数方法)#}
<h4>{{ dic.name.upper }}</h4>

模板之过滤器

  语法

{{obj|filter_name:param}}

default

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

{{value|default:"nothing"}}

length

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

{{value|length}}

filesizeformat

  将值格式化为一个可读的文件尺寸

{{value|filesizeformat}}

date

{#如果value=datetime.datetime.now()#}
{{value|date:"Y-m-d"}}

slice

{#如果value="hello world"#}
{{value|slice:"2:-1"}}

truncatechars

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

{{value|truncatechars:9}}

safe

  Django模板中会对HTML标签和js等语法进行自动转义,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,为了在Django中关闭HTML的自动转义的两种方式,如果是一个单独的变量可以通过"|safe"的方式告诉Django这段代码是安全的不必转义

value="<a href="">点击</a>"
{{value|safe}}

autoescape

  控制当前的自动转义行为,此标记采用on或者off作为参数,并确定自动转义是否在块内有效。该块以endautoescape结束标签关闭

def generate_report(request):
    report_name = "this is a test report"
    report_tilte = "<h1>this is a title</h1>"
    return render(request, 'report.html', locals())

   开启转义

{% autoescape on %}   
{{ report_title }}
{% endautoescape %}

  关闭转义,默认该语句块中的内容是安全的

{% autoescape off %}
{{ report_title }}
{% endautoescape %}

模板之标签

  标签比变量更加复杂:一些在输出中创建文本,一些通过循环或逻辑来控制流程,一些加载其后的变量将使用到额外信息到模板中,一些变迁需要开始和结束标签

for标签

{#遍历每一个元素#}
<h4>{{ dic.name.upper }}</h4>
{% for person in person_list %}
<p>{{ person.name }}</p>
{% endfor %}

{#遍历字典#}
{% for key,val in dic.items %}
    <p>{{ key }}:{{ val }}</p>
{% endfor %}

{#循环序号#}
{{forloop.counter}}

for...empty

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

{#for empty#}
{% for person in person_list %}
    <p>{{ person.name }}</p>
    {% empty %}
    <p>sorry,no person here</p>
{% endfor %}

if标签

  if标签会对一个变量求值,如果它的值是true,对应的内容块会输出

{#if标签#}
{% if num > 100 or num < 0 %}
    <p>无效</p>
{% elif num > 80 and num < 100 %}
    <p>优秀</p>
{% else %}
    <p>一般</p>
{% endif %}

with

  使用一个简单的名字缓存一个复杂的变量,当你需要使用一个方法很多次的时候是非常有用的

{#with标签#}
{% with total=business.employees.count %}
    {{ total}}employee{{ tatal|pluralize }}
{% endwith %}

csrf_token

  这个标签用于跨站请求伪造保护

{#csrf_token#}
{% csrf_token %}

自定义标签和过滤器

  在settings中的INSTALLED_APPS配置当前app

  在app中创建templatetags模块

  创建任意.py文件,如my_tags.py

from django import template
from django.utils.safestring import mark_safe

register = template.Library()

@register.filter
def filter_multi(x,y):
    return x*y

@register.simple_tag
def simple_tag_multi(x,y):
    return x*y

@register.simple_tag
def my_input(id,args):
    result="<input type='text' id='%s' class='%s'/>"%(id,args,)
    return mark_safe(result)

  在使用自定义simple_tag和fileter的html文件中导入之前创建的my_tag.py

{% load my_tag %}

  使用simple_tag和filter

{{ num|filter_multi:2 }}
{{ num|filter_multi:"[22,33,444]" }}
{#参数不限,但不能放在if for语句中#}
{% simple_tag_multi 2 5 %}
{% simple_tag_multi num 5 %}

{#filter可以用在if等语句后,simple_tag不可以#}
{% if num|filter_multi:30 > 100 %}
    {{ num|filter_multi:30 }}
{% endif %}
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
KlausMecial KlausMecial
3年前
Django的安装与简易使用
Django的安装与简易使用1.Django的简介Django是有Python编写的一个开源代码Web应用框架(网址:https://github.com/django/django)。他是基于MTV模式,其本质与MVC是一样的。具体是:1.M代表模型(Model):负责业务对象和数据库的关系映射(ORM)2.T代表模板(Template):负责
Wesley13 Wesley13
3年前
thinkphp3.2.3模板渲染支持三元表达式
thinkphp3.2.3模板渲染支持三元表达式{$status?'正常':'错误'}{$info'status'?$info'msg':$info'error'}注意:三元运算符中暂时不支持点语法。如下:           <divclass"modalhidefade"id'myModa
Stella981 Stella981
3年前
Django学习【第3篇】:Django之模板语法
Django框架之第三篇模板语法(重要!!!)(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2Fhaiyan123%2Fp%2F7725568.html)一、什么是模板?只要是在html里面有模板语法就不是html文件了,这样的文件就叫做模板。
Easter79 Easter79
3年前
SpringBoot使用JavaMailSender发送邮件(2)
为了更容易更规范维护邮件内容,我们推荐使用模板引擎技术。常用的模板引擎有这几种Thymeleaf、FreeMarker、Velocity等。我们在这里就使用前面两种来实现发送邮件。一、使用Thymeleaf模板技术发送邮件Thymeleaf是SpringBoot推荐的官方模板引擎技术,使用非常的简单方便。(1)添加依赖
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
Django学习手册
相关:Django的模板引擎提供一般性的功能函数,通过前端可以实现多数的代码逻辑功能,但它仅支持大多数常见情况下的函数功能,例如if判断,ifequal对比返回值等,复杂一些的函数功能并不支持,例如通过模板来判断一个返回值是否是合法的数字类型,如果又不希望通过后台视图代码来实现的话,就可以自定义一些前端函数功能。Django提供了两种方式    
Stella981 Stella981
3年前
Django 学习 之 模板(html)与配置静态文件
一.模板(html)1.模板语法之变量:语法为{{}}在Django模板中遍历复杂数据结构的关键是句点字符,语法:{{var\_name}}var\_name是一个变量名称,需要和views文件retu