Django框架之四-->模板

Django模板系统

记在前面

模板中可以使用request对象调用他的属性和方法

常用语法

只需要记两种特殊符号:

{{  }}和 {% %}

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

变量--万能的.

{{ 变量名 }}

变量名由字母数字和下划线组成。

点(.)在模板语言中有特殊的含义,用来获取对象的相应属性值。

你能使用.来从一个列表中取值,从一个字典中取值,获取一个对象的属性,更甚至来调用一个没有参数的方法

在列表中使用{{ 变量名.索引 }} 的方式取值

在字典中使用{{ 变量名.键 }} 的方式取值

在对象中使用{{ 变量名.属性名或方法名}} 的方式取值或得到返回值

Filters--过滤(有点像filter函数)

语法: {{ value|filter_name:参数 }}

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

# default
{{ 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 = "<a href='#'>点我</a>" {{ value|safe}}

# truncatechars
如果字符串字符多余指定的字符数量,那么会被截断,截断的字符串将以...结尾
参数:截断的字符数
{{ value|truncatechars:9}}
还有一个按单词分的(单词之间是空格),
{{ value|turncatewords }}

另一个将html文本渲染出样式的方法

from django.utils.safestring import mark_safe

自定义filters

文件所在位置

  文件所在的文件夹名为templatetags

  且文件夹需要与urls.py等文件同级(APP文件中)

  任意创建一个py文件
  创建名字交 register 的Library类的对象
  定义函数

第一种方式

from django import template
register = template.Library()
# 必须有上面两句

# name就是管道符后面的filter名
@register.filter(name="cut")
def cut(value, arg):  # value是管道符前value,arg是filter参数
    return value.replace(arg, "") # return值为模板中实际值

# 可以不指定name,使用函数名
@register.filterarg
def add_sb(value):
    return value+SB

使用

{{ somevariable|cut:"0" }} # 将"0"替换为空字符串
{{ d.name|addSB }} # 在后面添加一个SB(帅逼)

第二种方式

@register.simple_tag
def func(a1,a2,a3,a4):
    result = a1+a2+a3+a4
    return result

使用

{% func 1 2 3 4 %}

两种方式的区别

register.filterarg # 有且只可以有两个参数,第一个参数是|前的值,第二个参数要在函数名后:参数
{{ arg1|func:arg2}} # 且调用时使用两个{{}},并且可以作为if判断的条件()
# 可以处理arg2,使它变成多个值

register.simple_tag # 可以传递多个参数,按顺序传入
{% func 1 2 3 4 %} # 使用{% %} 的方式调用

第三种方式

from django import template
register = template.Library()  # register的名字是固定的,不可改变

@register.inclusion_tag("blog/archive.html")  # 传递一个HTML页面
def get_archive_style(username):
    ...
    return {kwargs}

  使用方法

{% load py文件名 %}
{% get_archive_style username %}
# 在一个模板中放入get_archive_style 并且给一个参数就是把函数的执行结果传递给装饰器中的模板,并且把
模板插入到这里

语法

for

<ul>
{% for user in user_list %}
    <li>{{ user.name }}</li>
{% endfor %}
</ul>

for循环可用的一些参数:

 

VariableDescription
forloop.counter 当前循环的索引值(从1开始)
forloop.counter0 当前循环的索引值(从0开始)
forloop.revcounter 当前循环的倒序索引值(从1开始)
forloop.revcounter0 当前循环的倒序索引值(从0开始)
forloop.first 当前循环是不是第一次循环(布尔值)
forloop.last 当前循环是不是最后一次循环(布尔值)
forloop.parentloop 本层循环的外层循环

for ... empty

for循环中没有值时走empty中的内容,让你知道这个是生效的,只是没有值

复制代码
<ul>
{% for user in user_list %}
    <li>{{ user.name }}</li>
{% empty %}
    <li>空空如也</li>
{% endfor %}
</ul>
复制代码

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 %}

csrf_token

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

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

会产生一个隐藏的input标签,用来校验

协商这一项后就不用注释配置文件中的csrf那一项了

注释

{#内容#}

母板

将一些相同的内容作为一个母板,向模板中填充内容来生成不同的页面

<!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>
  {% block page-css %}
  <!-- 这就是待填充的块 page-css 是这个块的名字,这是准备填充css的块-->
  {% endblock %}
</head>
<body>
<h1>这是母板的标题</h1>
{% block page-main %}
<!--一个准备填充HTML的块-->
{% endblock %}
<h1>母板底部内容</h1>
{% block page-js %}
<!--一个准备填充js的块-->
{% endblock %}
</body>
</html>
母板

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

{% extends "母板文件名" %}

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

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

{% block page-main %}
  <p>赵客缦胡缨,吴钩霜雪明。</p>
  <p>银鞍照白马,飒沓如流星。</p>
{% endblock %}

组件

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

{% include "文件名" %}

静态文件相关

动态的写static,修改配置文件中的STATIC_URL这一项时,不必再去修改文件中的内容

一个图片

{% load static %}
<img src="{% static 'images/hi.jpg' %}" alt="Hi!" />

引用js文件

{% load static %}
<script src="{% static 'mytest.js' %}"></script>

某个文件多出被用到可存到一个变量

{% load static %}
{% static "images/hi.jpg" as myphoto %}
<img src="{{ myphoto }}">

同时存在的还有load staticfiles,二者区别参考这里

使用get_static_prefix

也能完成上面的作用,还不带引号不带引号不带引号

图片

{% load static %}
<img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!" />

css

{% load static %}
<script src="{% get_static_prefix %}mytest.js "></script>

 

存变量

{% load static %}
 {% get_static_prefix as pre %}
<img src="{{ pre }}images/111.png" alt="">

 

posted @ 2018-01-18 21:13  瓜田月夜  阅读(154)  评论(0编辑  收藏  举报