第四篇Django之模板语言

Django之模板语言#

一 模板的执行#

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

Copy
def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html) 直接放在views里

二 模板语言#

2.1 变量 #

只需要记两种特殊符号

{{    }}   变量相关      {%  %}  逻辑相关

示例一:显示一个基本的字符串在网页上

views.py

Copy
def text_str(resquest): str = '我在学习Django' return render(resquest, 'home.html', {'str': str})

home.html

Copy
{{ str }}

2.2 Django模板中的for循环标签#

示例二(1):基本的for循环和list的内容

views.py

Copy
def text_list(resquest): list=['HTML','CSS','jquery','MySQL','python','Django'] return render(resquest, 'home.html', {'list': list})

home.html 

Copy
{{ list }} 得到一个列表 ================================================= {% for i in list %} {{ i }} 得到具体的值 {% endfor %}

示例二(2):dict的内容

views.py

Copy
def text_dic(resquest): dic={1:'HTML',2:'CSS'} return render(resquest, 'home.html', {'dic':dic})

home.html  

Copy
{{ dic.1 }} ---------- dic.key

在模板中取字典的键用 dic.1    而不是Python中的 dic['1']  

还可以这样遍历字典:

Copy
{% for key,value in dic.items %} {{ key }}:{{ value }} {% endfor %}

其实就是在遍历这样一个list:[(1,'HTML')(2,'CSS')]  

示例三 在模板进行 条件判断和for循环的详细操作

views.py 

Copy
def text_for(request): List = map(str, range(100))# 一个长度为100的 List return render(request, 'home.html', {'List': List})

home.html

不加任何符号

Copy
{% for item in List %} {{ item }} {% endfor %}

 

Copy
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
结果

加一个逗号

Copy
{% for item in List %} {{ item }}, {% endfor %}

 

Copy
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
结果

我们会发现最后一个元素后面也有一个逗号,这样肯定不爽,如何判断是不是遍历到了最后一个元素了呢?

用变量 forloop.last 这个变量,如果是最后一项其为真,否则为假,更改如下: 

Copy
{% for item in List %} {{ item }}{% if not forloop.last %},{% endif %} {% endfor %}
在for循环里面还有很多有用的东西
Variable Description
forloop.counter 当前循环的索引值(从1开始)
forloop.counter0 当前循环的索引值(从0开始)
forloop.revcounter 当前循环的倒序索引值(从1开始)
forloop.revcounter0 当前循环的倒序索引值(从0开始)
forloop.first 当前循环是不是第一次循环(布尔值)
forloop.last 当前循环是不是最后一次循环(布尔值)
forloop.parentloop 本层循环的外层循环

示例四 (1) 当列表中可能为空时用 for ...empty

Copy
<ul> {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% empty %} <li>抱歉,列表为空</li> {% endfor %} </ul>

(2) if,elif 和 else

Copy
{% if user_list %} 用户人数:{{ user_list|length }} {% elif black_list %} 黑名单数:{{ black_list|length }} {% else %} 没有用户 {% endif %}

(3)当然也可以只有if和else  

Copy
{% if user_list|length > 5 %} 七座豪华SUV {% else %} 黄包车 {% endif %}

2.3 Django模板中的条件判断标签#

示例五 if语句支持==、>、<、!=、<=、>=判断  

复制代码
Copy
{% if var >= 90 %} 成绩优秀 {% elif var >= 80 %} 成绩良好 {% elif var >= 70 %} 成绩一般 {% elif var >= 60 %} 需要努力 {% else %} 不及格啊,大哥!多学习啊! {% endif %}
复制代码

注意:比较符号前后必须有至少一个空格!

and, or, not, in, not in 也可以在模板中使用  

假如我们判断 num 是不是在 0 到 100 之间: 

Copy
{% if num <= 100 and num >= 0 %} num在0到100之间 {% else %} 数值不在范围之内! {% endif %} 

我们判断‘某某’在你不在一个列表中 

Copy
{% if '某某' in List %} 某某在名单中 {% endif %}

示例六 模板上得到视图对应的网址

复制代码
Copy
# views.py def add(request, a, b): c = int(a) + int(b) return HttpResponse(str(c))

# urls.py
urlpatterns = patterns('',
url(r
'^add/(\d+)/(\d+)/$', 'app.views.add', name='add'),
)

# template html
{% url 'add' 4 5 %} 

复制代码

这样网址上就会显示出:/add/4/5/ 这个网址,假如我们以后修改 urls.py 中的 

Copy
r'^add/(\d+)/(\d+)/$'

这一部分,改成别的,比如  

Copy
r'^jiafa/(\d+)/(\d+)/$'

这样,我们不需要再次修改模板,当再次访问的时候,网址会自动变成 /jiafa/4/5/  

示例七  取别名 

两种方法

① 

Copy
{% url 'some-url-name' arg arg2 as the_url %}

<a href="{{ the_url }}">链接到:{{ the_url }}</a>

②  

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

实例八,模板中 获取当前网址,当前用户等:  

8.1 获取当前用户

Copy
{{ request.user }}

如果登陆就显示内容,不登陆就不显示内容

Copy
{% if request.user.is_authenticated %} {{ request.user.username }},您好! {% else %} 请登陆,这里放登陆链接 {% endif %}

8.2.1 获取当前网址

Copy
{{ request.path }}

8.2.2 获取当前 GET 参数

Copy
{{ request.GET.urlencode }}

8.2.3 合并到一起用的一个例子

Copy
<a href="{{ request.path }}?{{ request.GET.urlencode }}&delete=1">当前网址加参数 delete</a>

比如我们可以判断 delete 参数是不是 1 来删除当前的页面内容  

2.4 Django模板中的过滤器(Filters)的使用#

语法:

Copy
{{ name|lower }}

示例

views.py

Copy
def home(request): name = ['HTML','CSS','jquery','MySQL','python','Django'] return render(request, 'home.html', {'name': name})

home.html

Copy
{{ name|lower}}

=========================  

其他用法#

1 default#

语法:

Copy
{{ value:default: "nothing"}} 

views.py

Copy
def home(request): name2 = [] return render(request, 'home.html', {'name': name})

home.html

Copy
{{ name:default: "nothing"}}

2 length  #

语法:  

Copy
{{ value|length }}

views.py  

Copy
def home(request): name = ['HTML','CSS','jquery','MySQL','python','Django'] return render(request, 'home.html', {'name': name})

home.py  

Copy
{{ name|length }}

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

3 filesizeformat  #

将值格式化成为一个‘人类可读的’文件尺寸(例如‘13KB’,'4,1MB',等待)

语法:

Copy
{{ value|filesizeformat }}

views.py  

Copy
def home(request): name = 123456789 return render(request, 'home.html', {'name': name}) 

home.py

Copy
{{ name|filesizeformat }}

4 slice切片#

语法:

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

views.py  

Copy
def home(request): name = ['HTML','CSS','jquery','MySQL','python','Django'] return render(request, 'home.html', {'name': name})

home.py

Copy
{{ name|slice:'0:4' }}

5 data  #

语法:

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

views.py  

Copy
import datetime

def home(request):
name
= datetime.datetime.now()
return render(request, 'home.html', {'name': name})

home.py

Copy
{{ name|date:'Y-m-d' }}

6 safe  #

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

语法:

Copy
{{ value|safe}}

views.py  

Copy
def home(request): value = "<a href='https://www.baidu.com/'>点我</a>" return render(request, 'home.html', {'value': value})

home.py

Copy
{{ value|safe}}

 7 truncatechars

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

参数:截断的字符数

语法:

Copy
{{ value|truncatechars:9}} 

views.py  

Copy
def home(request): value = "2018年3月28日外交部发言人" return render(request, 'home.html', {'value': value})

 home.py

Copy
{{ value|truncatechars:9}}

8 自定义fllter  

① 在app中创建templatetags 文件夹 (必须的

②创建任意的 .py 文件,如:my_tags.py

Copy
from django import template register = template.Library() #register的名字是固定的,不可改变 @register.filter() def filter_multi(v1,v2): return v1 * v2 

在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py :{% load my_tags %}

④views.py里

Copy
def home(request): num=12 return render(request, 'home.html', {'num': num})

⑤ 使用simple_tag和filter(如何调用)

Copy
-------------------------------.html {% load xxx %} #首行 # num=12 {{ num|filter_multi:2 }} #24

在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag.

注意:

filter可以用在if等语句后,simple_tag不可以

Copy
{% if num|filter_multi:30 > 100 %} {{ num|filter_multi:30 }} {% endif %}

===simple_tag===

my_tags.py

Copy
from django import template register = template.Library()

@register.simple_tag()
def simple_tag_multi(v1,v2,v3):
return v1v2v3

views.py

Copy
def home(request): return render(request, 'home.html')

home.html

Copy
{% load my_tags %}

{% simple_tag_multi 2 5 2%}

9 csrf_token#

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

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

例子:钓鱼网站

10 注释#

Copy
{# ... #}

三 母板  #

复制代码
Copy
<!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 %}

{% endblock %}
</head>
<body>

<h1>这是母板的标题</h1>

{% block page-main %}

{% endblock %}
<h1>母板底部内容</h1>
{
% block page-js %}

{% endblock %}
</body>
</html>

复制代码

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

继承母板#

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

Copy
{% extends 'layouts.html' %}

块  #

通过在母版中使用 {%block xxx%} 来定义‘块’

在子夜中通过定义母版中的block名来对应替换母版中相应的内容

母版html里

Copy
{% block page-main %}

{% endblock %} 

对应的html

Copy
{% block page-main %} <p>世情薄</p> <p>人情恶</p> <p>雨送黄昏花易落</p> {% endblock %}

组件  #

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

Copy
{% include 'navbar.html' %}

配置css/js 文件时#

母版html

Copy
{% block page-css %}{% endblock %} --------------------------------------------------------------- {% block page-js %}{% endblock %}

相应的html  

Copy
{% block page-css %} <link href="/static/css/dashboard.css" rel="stylesheet"> {% endblock %} ------------------------------------------------------------ {% block page-js %} <script src="/static/jquery-3.2.1.min.js"></script> {% endblock %}

静态文件相关#

导入文件#

Copy
{% load static %} <img src="{% static "img/img/sms.ivo" %}">

导入JS文件使用 #

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

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

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

另一种方法get_static_prefix #

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

或者

Copy
{% load static %} {% get_static_prefix as STATIC_PREFIX %}

<img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!" />
<img src="{{ STATIC_PREFIX }}images/hi2.jpg" alt="Hello!" />

inclusion_tag#

示例

templatetags/my_inclusion.py

复制代码
Copy
from django import template register = template.Library()

@register.inclusion_tag('result.html')
def show_results(n):
  
# 三元运算
n = 1 if n < 1 else int(n)
data
= ["第{}项".format(i) for i in range(1, n+1)].....//[第1项,第2项]
return {"data": data}

复制代码

templates/snippets/result.html

Copy
<ul> {% for i in data %} <li>{{ i }}</li> {% endfor %} </ul>

 templates/index.html  

Copy
{% load inclusion_tag_test %}

{% show_results 10 %}

 

  

 

posted @   流年中渲染了微笑  阅读(200)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
CONTENTS