模板语言:

1、我们先看下在命令行中渲染模板

先导入模块对象

2、渲染一个变量

  

<p>当前时间:{{ time }}</p>

  

 return render(request,"current_time.html",{"time":date_time,})

  

3、万能的句点号.

通过句点号获取列表的某个值,在模板语言中再也不适用中括号了

def index(request):
print(request.method)
temp = ["a","b","c"]
# return HttpResponse("haha")
return render(request,"index.html",{"list":temp})

  

在html文档中通过两个大括号加句点号获取变量的值

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>这是一个index的主页</h1>
<h2>{{ list.2 }}</h2>
</body>
</html>

  

在页面得到的效果

同样我们可以使用句点号去拿到字典的values的值

<h3>{{ temp.name }}</h3>

  

通过页面就可以获取到指定字典的值

句点号也可以获取某个对象的属性

def index(request):
class person(object):
def __init__(self,name,age):
self.name = name
self.age = age
def sb(self):
print("我的名字是{name},我的年龄是{age}".format(name = self.name,age = self.age)) print(request.method)
temp = ["a","b","c"]
# temp_dict = {"name":"alex","age":"23","email":"123456789@qq.com"}
# return HttpResponse("haha") p1 = person("alex","40")
return render(request,"index.html",{"obj":p1})

  

通过我们也可以通过句点号获取属性的值

    <h1>{{ obj.name }}</h1>
<h2>{{ obj.age }}</h2>
<h3>{{ obj }}</h3>

  

通过页面访问

下面在看下循环控制语句如何实现

先看下if-else语句如何实现

    {% if False %}
<p>hello 1</p>
{% elif 1 %}
<p>hello 2</p>
{% endif %}
</body>

  

在来看下for循环语句,这里的i和python中一样,是值,而不是索引

    {% for i in obj %}
<p>{{ i }}</p>
{% endfor %}

  

    temp_dict = {"name":"alex","age":"23","email":"123456789@qq.com"}
# return HttpResponse("haha") # p1 = person("alex","40")
# return render(request,"index.html",{"obj":p1}) return render(request, "index.html", {"obj": temp_dict})

  

因为i是值,那么我们如何拿到索引呢?用forloop.counter 来拿到,索引从1开始

    {% for i in obj %}
<p>{{ forloop.counter }}---->{{ i }}</p>
{% endfor %}

  

forloop.counter是从1开始,如果是forloop.counter0则是从0开始

    {% for i in obj %}
<p>{{ forloop.counter0 }}---->{{ i }}</p>
{% endfor %}

  

这里还可以倒序取数据

先看前端的代码

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<dl>
{% for i in obj %}
<li>{{ forloop.counter }}------>{{ i }}</li>
{% endfor %}
</dl> <ul>
{% for i in obj %}
<li>{{ forloop.counter0 }}------>{{ i }}</li>
{% endfor %}
</ul> <ul>
{% for i in obj %}
<li>{{ forloop.revcounter }}------>{{ i }}</li>
{% endfor %}
</ul>
</body>
</html>

  

后端代码

def test(request):
class person(object):
def __init__(self,name):
self.name = name def __str__(self):
return self.name obj = ["aaa","bbb","ccc"] return render(request,"template_test.html",locals())

  

最终前端的的效果

然后我们在来学习一下过滤器filter,主要用管道符

过滤器的作用就是:可以对字符串做处理,必须大写,小写,首字母大写之类的过滤和控制

upper:全大写

把当前字符串大写,我的后端传的小写的hello,通过filter把前端小写字母全部修改为大写字母

<h1>{{ obj|upper }}</h1>

  

lower:全小写

<h1>{{ obj|lower }}</h1>

  

capfirst:首字母小写

<h1>{{ obj|capfirst }}</h1>

  

add:做加法,比如下面的例子对对象加1

{{ obj|add:1 }}

  

cut:去掉指定的字符

{{ obj|cut:"1" }}

  

default:如果后端传递的变量是空,那么会用default后面的值代替

temp = ""
return render(request, "index.html", {"obj": temp})

  

{{ obj|default:"sb" }}

  

autoescape off:如果后端传递一个字符串是html标签格式的字符串,默认情况下页面不会做标签渲染,而仅仅会当做一个普通字符串进行渲染,但是如果我们要他渲染标签的话,就可以使用autoescape off来做

    {% autoescape off%}
{{ obj }}
{% endautoescape %} }

  

页面的效果

{{ obj|save}}的效果和上面的效果一样,就是告诉浏览器,我这段字符串是安全的,你可以帮我渲染

save这个最重要

{{obj|filesizeformat}}

这段大小

{{obj|first}}

第一个字符

{{obj|length}}

长度

{{obj|slice:"a:b"}}

切片

{{ obj|truncatechars:"6" }}

{#按照字符截字符串,截6个字符#}

{{ obj|truncatewords:"6" }}

{#按照单词截字符串,截6个单词#}

csrf_token:解决form表单跨站请求不安全的问题,加了这个,就不需要在settings注释跨站请求那一行

<form>
<input type="text">
<input type="text">
<input type="submit">
{% csrf_token %}
</form>

  

verbatim:如果我们就是显示一个{{ name }},就需要用到下面的格式来

    {% verbatim %}
{{ name }}
{% endverbatim %}

  

自定义过滤器

  1、先在指定的app的目录下创建一个”templatetags“的目录

  2、在这个目录下创建一个py文件,此时在setting中必须要这个有app的记录

  3、在py文件中的引入2个模块

4、在html文件引入这个文件

{% load mytag %}

  

5、然后在html文件使用我们定义的函数

    {% add100 1 %}

  

6、页面的结果如下

上面的自定义过滤器先忽略吧,下面重新做一下总结

1、自定义标签

a、首先确认在setting的install_apps中有我们的app

b、然后在对应的app的目录下创建templatetags目录,名称必须是这个,不能更改

c、然后在目录下创建py文件,名称可以自定义,这个py文件要引入下面2个模块和定义register变量

from django import template

from django.utils.safestring import mark_safe

register =template.Library()
# register是固定变量,不可改变

  

d、首先自定义一个标签

首先一个参数的标签

@register.simple_tag
def add100(arg):
arg = int(arg)
return arg + 100

  

在定义一个多个参数的标签

@register.simple_tag
def add1000(arg1,arg2,arg3):
arg1 = int(arg1)
arg2 = int(arg2)
arg3 = int(arg3)
return arg1 + 100 + arg2 + arg3

  

前端用下面的调用

a、首先要先引入我们定义的py文件

b、定义一个自定义标签

b_1、一个参数的自定义标签

{% add100 100 %}

  

b_2、多个参数的自定义标签

{% add1000 100 200 300 %}

  

下面我们在来看自定义过滤器,过滤器最多只能接受2个参数

也是在上面创建的py文件定义过滤器

引入mytag文件

{% load  my_tag %}

  

前端调用我们的自定义过滤器

    {{ num|add200 }}
{# num就是add100这个函数的参数#} {{ num|add_new:1000 }}
{# num是add_new的第一个参数,1000是add_new的第二个参数#}

  

我们看下mytag中如何定义这2个自定义过滤器

@register.filter
def add200(arg):
arg = int(arg)
return arg + 200 @register.filter
def add_new(arg1,arg2):
arg1 = int(arg1)
arg2 = int(arg2)
return arg1 + 200 + arg2

  

我们看下前端渲染的结果

Django的模板语言介绍的更多相关文章

  1. Django之模板语言

    一.模板语言介绍 模板语言渲染的整个过程其实就是将html转换成函数,并为该函数提供全局变量,然后执行该函数 二.模板语言的语法 模板中也有自己的语言,该语言可以实现数据展示 # 业务请求处理做的页面 ...

  2. Django的模板语言

      Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 {{ 变量名 }} 变量名由字母数字和下划线组成. ...

  3. django 更新 模板语言

    Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 在Django的模板语言中按此语法使用:{{ 变量名 ...

  4. Django之模板语言(一)

    1.Django的模板语言(简而言之,字符串替换) 1.目前为止已经学过的模板语言: 1.{{ name }}  ------>变量 2. for 循环: {% for i in book_li ...

  5. 第四篇Django之模板语言

    Django之模板语言 一 模板的执行 模板的创建过程,对于模板,其实就是读取模板(其中嵌套着模板的标签),然后将Model中获取的数据插入到模板中,最后将信息返回给用户 def current_da ...

  6. django的模板语言中一些之前没有用过的小点

    1.模板语言中的for循环的最后一个的表示方式 {% for auther in auther_list %} {% if forloop.last %} {# 这里的意思是for循环的最后一个的意思 ...

  7. django 中模板语言的各种用法

    模板 1.视图中使用模板 模版的创建过程,对于模版,其实就是读取模版(其中嵌套着模版标签),然后将 Model 中获取的数据插入到模版中,最后将信息返回给用户 1.普通方法:HTML被直接硬编码在 P ...

  8. Django之模板语言(四) ------>Tags

    案例1:单层for循环 # Django 模板语言测试代码 def template_test(request): name_list=["张三","李四",& ...

  9. Django之模板语言(三)------>自定义filter

    1.自定义filter: 1.在app01下面新建一个templatetags的python package包. 如果没有app01的话,可以通过命令行在manage中进行创建:python mana ...

随机推荐

  1. Vcenter一次性将服务器四个网卡从端口组迁移到分布式交换机的方法

    如果你的服务器已经在清单列表里了,那么可以先从分布式交换机将这台服务器删除,然后再添加一次.这个时候的添加就可以选择四个网卡(包括端口组,包括管理端口组),一次性加入分布式交换机

  2. 服务器开启JMX监控

    JMX是一个框架,提供了一种功能,可以实时查询应用程序中通过JMX向外部公布的相应参数或者是其他应用程序,同时也可以通过JMX来实时地调用应用程序使用JMX向外部公布的接口,来完成一些功能操作. 如果 ...

  3. 在ie6下的png图片的兼容问题

    png图片在ie6下是这样的: 正确样式: 这样解决: html代码: <body> <div class="gys"></div> </ ...

  4. MySQL 序列 AUTO_INCREMENT

    MySQL序列是一组整数:1, 2, 3, ...,由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现. 本章我们将介绍如何使用MySQL的序列 ...

  5. 提高solr的搜索速度

    之前是使用12台机分布式搜索,1台为主机做索引并分发给子机,8台做大索引搜索服务,3 台做小索引搜索服务,配置基本是内存在4-8G,cpu:2-8core的服务器,索引的大小为8G.搜索的响应时间 是 ...

  6. 转载 深入理解java类加载器

    1 基本信息 每个开发人员对java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这背后就涉及到了java技术体系中的类加载.Java的类加载机制是技术体系中比较核心的 ...

  7. 委托学习过程及委托、Lambda表达式和匿名方法的关系总结及事件总结

    第一章,当开始学习委托的时候,我们会问什么是委托?为什么要学习委托? 一,什么是委托? 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法, ...

  8. 0_Simple__simpleMPI

    MPI 的简单使用 ▶ 源代码.主机根结点生成随机数组,发布副本到各结点(例子用孩子使用了一个结点),分别使用 GPU 求平方根并求和,然后根结点使用 MPI 回收各节点的计算结果,规约求和后除以数组 ...

  9. spring security 参考 和 例子

    参考1: https://docs.spring.io/spring-security/site/docs/5.0.1.BUILD-SNAPSHOT/reference/htmlsingle/ 列子: ...

  10. cv::circle《转》

    void circle(CV_IN_OUT Mat& img, Point center, int radius, const Scalar& color, int thickness ...