柚子快报激活码778899分享:Djnago模板与标签

http://www.51969.com/

1.模版系统

基本语法

{{ }}和 {% %}

变量相关的用{{}},逻辑相关的用{%%}。

变量

在Django的模板语言中按此语法使用:{{ 变量名 }}。

python基础的基本数据类型可以通过{{ }} 来获取

后端传函数名到前端,会自动加括号调用,但是不支持传参

后端传对象到前端,就相当于打印了这个对象

前端获取后端传过来的容器类型的内部元素 统一采用句点符(.)

过滤器

在Django的模板语言中,通过使用 过滤器 来改变变量的显示。

过滤器的语法: {{ value|filter_name:参数 }}

使用管道符"|"来应用过滤器。

例如:{{ name|lower }}会将name变量应用lower过滤器之后再显示它的值。lower在这里的作用是将文本全都变成小写。

注意事项:

过滤器支持“链式”操作。即一个过滤器的输出作为另一个过滤器的输入。

过滤器可以接受参数,例如:{{ sss|truncatewords:30 }},这将显示sss的前30个词。

过滤器参数包含空格的话,必须用引号包裹起来。比如使用逗号和空格去连接一个列表中的元素,如:{{ list|join:', ' }}

'|'左右没有空格没有空格没有空格

default

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

{{ value|default:"nothing"}} //如果value没有传值或者值为空的话就显示nothing

length

返回值的长度,作用于字符串和列表。

{{ value|length }}

返回value的长度,如 value=['a', 'b', 'c', 'd']的话,就显示4.

filesizeformat

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

{{ value|filesizeformat }}

如果 value 是 123456789,输出将会是 117.7 MB。

slice

切片

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

date

格式化

{{ value|date:"Y-m-d H:i:s"}}

safe

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

比如:

value = "点我"

{{ value|safe}}

后端取消转义

from django.utils.safestring import mark_safe

xxx = mark_safe('

我是h1标签

')

truncatechars

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

参数:截断的字符数

{{ value|truncatechars:9}}

truncatewords

在一定数量的字后截断字符串。

{{ value|truncatewords:9}}

cut

移除value中所有的与给出的变量相同的字符串

{{ value|cut:' ' }}

如果value为'i love you',那么将输出'iloveyou'.

join

使用字符串连接列表,例如Python的str.join(list)

timesince

将日期格式设为自该日期起的时间(例如,“4天,6小时”)。

采用一个可选参数,它是一个包含用作比较点的日期的变量(不带参数,比较点为现在)。 例如,如果blog_date是表示2006年6月1日午夜的日期实例,并且comment_date是2006年6月1日08:00的日期实例,则以下将返回“8小时”:

{{ blog_date|timesince:comment_date }}

分钟是所使用的最小单位,对于相对于比较点的未来的任何日期,将返回“0分钟”。

标签

    {% for user in user_list %}

  • {{ user.name }}
  • {% endfor %}

for循环可用的一些参数:

Variable

Description

forloop.counter

当前循环的索引值(从1开始)

forloop.counter0

当前循环的索引值(从0开始)

forloop.revcounter

当前循环的倒序索引值(从1开始)

forloop.revcounter0

当前循环的倒序索引值(从0开始)

forloop.first

当前循环是不是第一次循环(布尔值)

forloop.last

当前循环是不是最后一次循环(布尔值)

forloop.parentloop

本层循环的外层循环

for ... empty

    {% for user in user_list %}

  • {{ user.name }}
  • {% empty %}

  • 空空如也
  • {% endfor %}

if判断

if,elif和else

{% if user_list %}

用户人数:{{ user_list|length }}

{% elif black_list %}

黑名单数:{{ black_list|length }}

{% else %}

没有用户

{% endif %}

当然也可以只有if和else

{% if user_list|length > 5 %}

七座豪华SUV

{% else %}

黄包车

{% endif %}

if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。

with

定义一个中间变量,多用于给一个复杂的变量起别名。

注意等号左右不要加空格。

{% with total=business.employees.count %}

{{ total }} employee{{ total|pluralize }}

{% endwith %}

{% with business.employees.count as total %}

{{ total }} employee{{ total|pluralize }}

{% endwith %}

csrf_token

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

在页面的form表单里面写上{% csrf_token %}

注释

{# ... #}

注意事项

\1. Django的模板语言不支持连续判断,即不支持以下写法:

{% if a > b > c %}

...

{% endif %}

\2. Django的模板语言中属性的优先级大于方法

def xx(request):

d = {"a": 1, "b": 2, "c": 3, "items": "100"}

return render(request, "xx.html", {"data": d})

如上,我们在使用render方法渲染一个页面的时候,传的字典d有一个key是items并且还有默认的 d.items() 方法,此时在模板语言中:

{{ data.items }}

默认会取d的items key的值

模板系统

先定义一个Base类,这个页面是页面的框架

Title

{% block page-css %}

{% endblock %}

这是母板的标题

{% block page-main %}

{% endblock %}

母板底部内容

{% block page-js %}

{% endblock %}

注意:我们通常会在母板中定义页面专用的CSS块和JS块,方便子页面替换。

一个项目给出的模版约多,就说明网站的可扩展性越好。

继承母板

在子页面中在页面最上方使用下面的语法来继承母板。

{% extends 'layouts.html' %}

块(block)

通过在母板中使用{% block xxx %}来定义"块"。

在子页面中通过定义母板中的block名来对应替换母板中相应的内容。

{% block page-main %}

世情薄

人情恶

雨送黄昏花易落

{% endblock %}

组件

可以将常用的页面内容如导航条,页尾信息等组件保存在单独的文件中,然后在需要使用的地方按如下语法导入即可。

{% include 'navbar.html' %}

静态文件相关

{% load static %}

柚子快报激活码778899分享:Djnago模板与标签  第1张

引用JS文件时使用:

{% load static %}

某个文件多处被用到可以存为一个变量

{% load static %}

{% static "images/hi.jpg" as myphoto %}

柚子快报激活码778899分享:Djnago模板与标签  第2张

{% get_static_prefix %}

{% load static %}

柚子快报激活码778899分享:Djnago模板与标签  第3张

或者

{% load static %}

{% get_static_prefix as STATIC_PREFIX %}

柚子快报激活码778899分享:Djnago模板与标签  第4张

柚子快报激活码778899分享:Djnago模板与标签  第5张

自定义过滤器和标签

在应用名下新建一个名为templatetags文件夹(必须叫这个名字)

在该新建的文件夹内新建一个任意名称的的py文件(我这里取名my_tag)

进入文件在文件写入固定格式代码

from django import template

register = template.Library()

自定义过滤器

在py文件中继续写入

@register.filter(name='plus')

def index(a, b): # 过滤器只能穿两个参数但是你可以穿给函数一个容器

return a + b

前端使用

{% load my_tag % }

{34|plus:8}

自定义标签

# 自定义标签

@register.simple_tag

def plus(a, b, c):

return a + b + c

在前端中使用

{% load my_tag %}

{% plus 1 2 3 %}

标签和锅炉起有什么不一样

标签是在{%%}中使用 过滤器是在{{}}中使用,而且必须用|

标签可以穿很多值,过滤器只能穿两个值

自定义include_tag

@register.inclusion_tag('login.html', name='login')

def login(n):

# l = []

# for i in range(n):

# l.append('第%s项'%i)

l = ['第%s项' % i for i in range(n)]

return {'l': l}

新建一个HTML页面

# login.html

< ul >

{ %

for foo in l %}

< li > {{foo}} < / li >

{ % endfor %}

< / ul >

前端调用

# 调用

{% login 5 %}

柚子快报激活码778899分享:Djnago模板与标签

http://www.51969.com/

查看原文