模板层(template)

概念:

 模板与html的区别:  模板=html+模板语法

模板语法:

1 变量:
       {{}}
    深度查询: 通过句点符.
    列表,字典
    class 里面的str方法
    class里面的方法可以通过句点来使用,但是这个方法不能有参数
    locals()全拿过来了这个指的的前端页面和后端的render函数的第三个参数
    {% for person in personlist%}
    <p> {{person.age}},{{person.name}}</p>
    {% endfor%}
    过滤器 filter
    {{t|date:"Y-m-d"}}
    default
   
    截断字符
    截断单词
    安全机制  safe
   
 2 标签
    {%tag%}
    反向
    加前面序号
    python中enumerate也可以加序号
    if 标签
    =两边不用空格
    csrf-token
    中间件 相当于看大门的
   
    常用的:
    for循环
    if else
 3 自定过滤器与标签
 
    自定义过滤器的步骤:
     步骤:
       1 在settings中的INSTALLED_APPS,是否有当前应用
   
    2 在应用中创建一个templatetags
   
    3 在templatetags中创建py文件:mytag.py
   
    4 在mytag.py中:
        引入:
       from django import template
    from django.utils.safestring import mark_safe

register = template.Library()   #register的名字是固定的,不可改变
  
           5 定义过滤器和标签
          @register.filter
    def multi(x,y):
     return x*

@register.simple_tag
    def multiTag(x,y,z):
     return x*y*z
     
     6  在引用模板中导入:{% load mytag %}
    
     7  调用:
             过滤器:  {{var|filter_name:参数}}  # 参数只能是一个
 
                标签:    {% simple_tag 参数1 参数2 ... %}
      
    对比过滤器与自定义标签的使用:
             过滤器函数的参数只能有两个,自定义标签无参数限制
       过滤器可以与逻辑标签共同使用,比如if标签。自定义标签不可以。
    过滤器只能接受两个参数:左右各一个  可以逻辑判断,比如同if标签
    自定义标签可以接受多个参数放在函数名字后面 这个不能判断  单独使用

你可能已经注意到我们在例子视图中返回文本的方式有点特别。 也就是说,HTML被直接硬编码在 Python代码之中。

def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)

代码

尽管这种技术便于解释视图是如何工作的,但直接将HTML硬编码到你的视图里却并不是一个好主意。 让我们来看一下为什么:

对页面设计进行的任何改变都必须对 Python 代码进行相应的修改。 站点设计的修改往往比底层 Python 代码的修改要频繁得多,因此如果可以在不进行 Python 代码修改的情况下变更设计,那将会方便得多。

  • Python 代码编写和 HTML 设计是两项不同的工作,大多数专业的网站开发环境都将他们分配给不同的人员(甚至不同部门)来完成。 设计者和HTML/CSS的编码人员不应该被要求去编辑Python的代码来完成他们的工作。

  • 程序员编写 Python代码和设计人员制作模板两项工作同时进行的效率是最高的,远胜于让一个人等待另一个人完成对某个既包含 Python又包含 HTML 的文件的编辑工作。

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

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

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

def time(request):
import datetime
t = datetime.datetime.now()
# 方式1
# return HttpResponse("<h style='color :red'>current time:%s</h>"%str(t)[:19])#这个就可以返回各种标签
# 方式2
# from django.template import Template, Context
# time1 = datetime.datetime.now()
# templateObj =Template("<h style='color :red'>current time:{{time}}</h>")
# contextObj = Context({"time": str(time1)})
# html = templateObj.render(contextObj)
# return HttpResponse(html)
# 方式3
return render(req, 'current_datetime.html', {'current_date':str(now)[:19]})

模板语法变量

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

{{var_name}}
 l = [11, 22, 88]
dic = {"name": "frank", "age": 23} name="hello frank"
s = 10
label="<a href="">点击</a>"
class Person(object):
def __init__(self,name,age):
self.name = name
self.age = age
def __str__(self):
return self.name+str(self.age)
def dream(self):
return "I am dreaming"
person_yuan=Person("egon",100)
person_frank=Person("frank",13)
person_alex=Person("alex",14)
person_list=[person_alex,person_frank,person_yuan]
<p><h2>{{ l.0 }}</h2></p>
<p><h2>{{ dic.name}}</h2></p>
<p><h2>{{ dic.age}}</h2></p>
<p><h2>{{ s}}</h2></p>
<p><h2>{{ person_list.1.age}}</h2></p>

注意:句点符也可以用来引用对象的方法(无参数方法)。

<p><h2>{{ person_list.1.dream}}</h2></p>

模板之过滤器

语法:

{{obj|filter__name:param}}

default

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

{{ value|default:"nothing" }}

length

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

{{ value|length }}

如果 value 是 ['a', 'b', 'c', 'd'],那么输出是 4。

filesizeformat

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

{{ value|filesizeformat }}

date

如果 value=datetime.datetime.now()

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

slice

如果 value="hello world"

{{ value|slice:"2:-1" }}

truncatechars

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

参数:要截断的字符数

{{ value|truncatechars:9 }}

如果value“Joel 是 a >,输出将为“Joel i ...”

safe

Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。比如:

value="<a href="">点击</a>"

{{ value|safe}}

常用的模板的过滤器,更多详见

模板之标签 

标签看起来像是这样的: {% tag %}。标签比变量更加复杂:一些在输出中创建文本,一些通过循环或逻辑来控制流程,一些加载其后的变量将使用到的额外信息到模版中。

一些标签需要开始和结束标签 (例如{% tag %} ...标签 内容 ... {% endtag %})。

for标签

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

可以利用{% for obj in list reversed %}反向完成循环。

遍历一个字典:

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

注:循环序号可以通过{{forloop}}显示

forloop.counter         The current iteration of the loop (1-indexed)
forloop.counter0    The current iteration of the loop (0-indexed)
forloop.revcounter  The number of iterations from the end of the loop (1-indexed)
forloop.revcounter0 The number of iterations from the end of the loop (0-indexed)
forloop.first           True if this is the first time through the loop
forloop.last            True if this is the last time through the loop
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 %}

with

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

例如:

{% with total=business.employees.count %}
{{ total }} employee{{ total|pluralize }}
{% endwith %}

csrf_token

csrf_token

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

自定义标签和过滤器

自定义过滤器的步骤:
     步骤:
       1 在settings中的INSTALLED_APPS,是否有当前应用
   
    2 在应用中创建一个templatetags
   
    3 在templatetags中创建py文件:mytag.py
   
    4 在mytag.py中:
        引入:
       from django import template
    from django.utils.safestring import mark_safe

register = template.Library()   #register的名字是固定的,不可改变
  
           5 定义过滤器和标签
          @register.filter
    def multi(x,y):
     return x*y

@register.simple_tag
    def multiTag(x,y,z):
     return x*y*z
     
     6  在引用模板中导入:{% load mytag %}
    
     7  调用:
             过滤器:  {{var|filter_name:参数}}  # 参数只能是一个
 
                标签:    {% simple_tag 参数1 参数2 ... %}
      
    对比过滤器与自定义标签的使用:
             过滤器函数的参数只能有两个,自定义标签无参数限制
       过滤器可以与逻辑标签共同使用,比如if标签。自定义标签不可以。

 

代码汇总:

views

from django.shortcuts import render, HttpResponse

# Create your views here.
def time(request):
import datetime
t = datetime.datetime.now()
# 方式1
# return HttpResponse("<h style='color :red'>current time:%s</h>"%str(t)[:19])#这个就可以返回各种标签
# 方式2
# from django.template import Template, Context
# time1 = datetime.datetime.now()
# templateObj =Template("<h style='color :red'>current time:{{time}}</h>")
# contextObj = Context({"time": str(time1)})
# html = templateObj.render(contextObj)
# return HttpResponse(html) # 方式3
l = [11, 22, 88]
dic = {"name": "frank", "age": 23} name="hello frank"
s = 10
label="<a href="">点击</a>"
class Person(object):
def __init__(self,name,age):
self.name = name
self.age = age
def __str__(self):
return self.name+str(self.age)
def dream(self):
return "I am dreaming"
person_yuan=Person("egon",100)
person_frank=Person("frank",13)
person_alex=Person("alex",14)
person_list=[person_alex,person_frank,person_yuan]
li=[]
i=101
content="lajgolajhgl jalhjal jalgaj lajhlajl ajghlj l alhjl "
return render(request, "time.html", {"time": t,"l":l,"s":s,"dic":dic,"person_list":person_list,"li":li,"name":name,"content":content,"label":label,"i":i})#关于如果前端设置了样式,后端不需要处理
def index(request): return HttpResponse("OK")

index.html

{% load mytag %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Title</title>
</head>
<body> <p><h2>{{ l.0 }}</h2></p>
<p><h2>{{ dic.name}}</h2></p>
<p><h2>{{ dic.age}}</h2></p>
<p><h2>{{ s}}</h2></p>
<p><h2>{{ person_list.1.age}}</h2></p>
<p><h2>{{ person_list.1.dream}}</h2></p>
<hr>
{% for person in person_list reversed %}
<p>{{ forloop.counter0 }} -----{{ person.name }},{{ person.dream }},{{ person }}</p>
{% endfor %}
{#{% for k,v in dic.items %}//字典循用.itmes#}
{# <p> {{ k }},{{ v }}</p>#}
{#{% endfor %}#}
<p><h>current time:{{ time|date:"Y-m-d" }}</h></p>
<p><h>{{li|default:"没有符合条件的书籍"}}</h></p>
<p><h>{{name|slice:"2:-1"}}</h></p>
<p><h>{{content|truncatechars:9}}</h></p>
<p><h>{{label|safe}}</h></p><!--//不要转义-->注销
<p><h>{{content|truncatewords:3}}</h></p>
<p>{{ i|multi:5 }}</p> {% if i|multi:5 > 1000 %}
<p>大于</p>
{% else %}
<p>小于或等于</p>
{% endif %} <p>{% multi1 i 2 5 %} </p><!--自定义标签-->
{% if i > 100 %}
<p>{{ i }}</p>
{% elif i < 80 %}
<p>"不太好"</p>
{% else %}
<p>"很好"</p>
{% endif %}
{% with a="ajgjaljhaj" %}
<p>{{ a }}</p>
{% endwith %}
<form action="/index/" method="post">
{% csrf_token %}
<p>姓名:<input type="text"></p>
<p><input type="submit"></p>
</form>
</body>
</html>

自定义标签与过滤器

from django import template
from django.utils.safestring import mark_safe register = template.Library() #register的名字是固定的,不可改变
@register.filter
def multi(x,y):
return x*y
@register.simple_tag
def multi1(x,y,z):
return x*y*z

Django之Template的更多相关文章

  1. django模板(template)

    模板层(template) 你可能已经注意到我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python代码之中. 1 2 3 4 def current_datetime ...

  2. 六、Django之Template

    一.Template由来 1.任何前端页面的改动都和后端有关: 2.前端HTML和后端python分开能让网站更加清晰: 3.前后端分离的趋势下,专业的事交给专业的人做. 二.Django中的temp ...

  3. Django——模版Template报错

    >>> from django.template import Template >>> t = Template("My name is {{ my_n ...

  4. Django之template操作

    一.模板渲染的原理 (一)使用 模板渲染首先有一个模板对象Template,然后有一个上下文对象Context,通过render方法进行渲染,最后返回字符串,render方法的本质还是调用了HttpR ...

  5. python——初识django的template

    这周听了老师讲关于django的框架问题,第一次比较透彻的了解了mtv框架.也是第一次接触模板的概念,研究了一下,现在就记录下来好嘞... 首先要介绍一点关于django的模板:我们为什么要使用模板呢 ...

  6. [django]模板template原理

    django 中的render和render_to_response()和locals(): http://www.cnblogs.com/wangchaowei/p/6750512.html 什么是 ...

  7. 自定义django的Template context processors

    简要步骤: 1.编辑一个函数: def media_url(request): from django.conf import settings return {'media_url': settin ...

  8. Python Django 之 Template 模板的使用

    一.模板样式 注意: 1.url urlpatterns = { path('admin/', admin.site.urls), path('order/', views.order), path( ...

  9. django unresolved template

    参考:https://stackoverflow.com/questions/8487410/pycharm-django-1-3-static-url-in-templates-unresolved ...

随机推荐

  1. TopK

    网易面试挂了,伤心. 一面面试官不是搞技术的,二面面试官搞ios,全程不问JVM,并发的知识,运气真差 而且手撸代码硬伤,没得编译 准备先在IDE敲一遍,在再纸上面写一遍. package com.q ...

  2. K均值聚类

    聚类(cluster)与分类的不同之处在于, 分类算法训练过程中样本所属的分类是已知的属监督学习. 而聚类算法不需要带有分类的训练数据,而是根据样本特征的相似性将其分为几类,又称为无监督分类. K均值 ...

  3. 初识Scala

    scala 是 scalable Language 的简写,是一门多范式的编程语言. scala是一种纯面向对象的语言每个值都是对象, 同时支持大量的函数式特性. scala运行于Java虚拟机(JV ...

  4. 浩顺考勤机二次开发(第二版,附实测可用的demo)

    1.背景 之前写过一次浩顺考勤机的二次开发,不过那个版本还是有一些问题,后来更换了新的考勤机,又拿到了新的二次开发包,所以就有了这次这个版本 2.关于考勤机的一些说明 2.1 首先要给考勤机设定ip, ...

  5. WPF 使用 Direct2D1 画图入门

    本文来告诉大家如何在 WPF 使用 D2D 画图. 本文是一个系列 WPF 使用 Direct2D1 画图入门 WPF 使用 Direct2D1 画图 绘制基本图形 WPF 使用 SharpDX WP ...

  6. JS读取服务器返回的XMl格式字符串

    function PostSMS(phoneNumber, sessionID, requestUrl, successAction) { $.ajax( { type: 'POST', url: r ...

  7. IDEA 在使用的过程中字符间距变大的问题

    解决办法:shift+空格半角全角快捷键

  8. JavaScript函数箭头的优势在哪里

    译者按: 看上去只是语法的变动,其实也影响了this的作用域. 原文: JavaScript: Arrow Functions for Beginners 译者: Fundebug 为了保证可读性,本 ...

  9. git 命令小总结

    下载代码 git clone http://admin@192.168.0.208:7990/scm/klvchen/tale.git 设置用默认户名和密码登录,注意 URI 前面不允许有 http, ...

  10. HTML5的DeviceOrientation实现微信摇一摇功能

    在HTML5中,DeviceOrientation特性所提供的DeviceMotion事件封装了设备的运动传感器时间,通过改时间可以获取设备的运动状态.加速度等数据(另还有deviceOrientat ...