Django之模板语言

Django之模板语言

一 模板的执行

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

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

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

home.html

{{ str }}

2.2 Django模板中的for循环标签

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

views.py

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

home.html 

{{ list }}                  得到一个列表

=================================================
{% for i in list %}{{ i }}                     得到具体的值{% endfor %}

示例二(2):dict的内容

views.py

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

home.html  

{{ dic.1 }}             dic.key

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

还可以这样遍历字典:

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

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

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

views.py 

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

home.html

不加任何符号

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

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

结果

加一个逗号

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

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 这个变量,如果是最后一项其为真,否则为假,更改如下: 

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

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

(2) if,elif 和 else

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

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

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

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

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

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

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

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

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

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

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

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

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

# 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 中的

r‘^add/(\d+)/(\d+)/$‘

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

r‘^jiafa/(\d+)/(\d+)/$‘

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

示例七  取别名 

两种方法

① 

{% url ‘some-url-name‘ arg arg2 as the_url %}

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

②  

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

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

8.1 获取当前用户

{{ request.user }}

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

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

8.2.1 获取当前网址

{{ request.path }}

8.2.2 获取当前 GET 参数

{{ request.GET.urlencode }}

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

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

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

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

语法:

{{ name|lower }}

示例

views.py

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

home.html

{{ name|lower}}

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

其他用法

1 default

语法:

{{ value:default: "nothing"}}

views.py

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

home.html

{{ name:default: "nothing"}}

2 length  

语法:  

{{ value|length }}

views.py  

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

home.py  

{{ name|length }}

‘|‘左右没有空格没有空格没有空格  

3 filesizeformat  

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

语法:

{{ value|filesizeformat }}

views.py  

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

home.py

{{ name|filesizeformat }}

4 slice切片

语法:

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

views.py  

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

home.py

{{ name|slice:‘0:4‘ }}

5 data  

语法:

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

views.py  

import datetime

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

home.py

{{ name|date:‘Y-m-d‘ }}

6 safe  

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

语法:

{{ value|safe}}

views.py  

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

home.py

{{ value|safe}}

7 truncatechars

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

参数:截断的字符数

语法:

{{ value|truncatechars:9}}

views.py  

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

home.py

{{ value|truncatechars:9}}

8 自定义fllter  

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

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

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里

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

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

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

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

注意:

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

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

===simple_tag===

my_tags.py

from django import template
register = template.Library()

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

views.py

def home(request):
    return render(request, ‘home.html‘)

home.html

{% load my_tags %}

{% simple_tag_multi 2 5 2%}

9 csrf_token

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

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

例子:钓鱼网站

10 注释

{# ... #}

三 模板  

<!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块,方便子页面替换。

继承母板

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

{% extends ‘layouts.html‘ %}

块  

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

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

母版html里

{% block page-main %}

{% endblock %}

对应的html

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

组件  

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

{% include ‘navbar.html‘ %}

配置css/js 文件时

母版html

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

相应的html  

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

静态文件相关

导入文件

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

导入JS文件使用 

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

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

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

另一种方法get_static_prefix 

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

或者

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

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

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

templates/index.html  

{% load inclusion_tag_test %}

{% show_results 10 %}

  

原文地址:https://www.cnblogs.com/a438842265/p/8671041.html

时间: 2024-08-29 18:59:00

Django之模板语言的相关文章

Django 之 模板语言

一.views.py 的代码 class Person(object): def __init__(self,name,age): self.name = name self.age = age def test(request): ''' 模板语言学习 :param request: :return: ''' name = "kang" #变量 name_list = ["Mingkang", "BearBear", "BenBen&

Django之模板语言(二)-----Filter

1.其他常用的模板语言: 通过模板语言可以让前端页面显示数据,数据可以是基本数据类型,也可以是对象亦或者对象的列表,结合着模板中的for.if等配合使用. 要注意前端页面中,出现没有后端数据的情况,随便写了一个变量,结果在前端页面中不会显示. 怎么让这个随便的变量不随便捏,可以使用defalut默认显示. 如何在模板语言中显示文件的大小? 如何在模板语言中格式化的显示时间? 如何在模板中安全的显示后台传过来的html代码? 如何对于模板语言中不存在的变量可以默认显示? 如何进行切片操作?slic

py18_06:Django之模板语言

1. 模板变量的命名规则: 同样的是与其他语言一样,使用字母,下划线,数字.区别:其他的不能以数字开头,模板语言是不能以下划线开头 2. 调用变量 {{ }},用双大括号 如果是字段,则用{% %},比如,for循环,if等 模板语言里,还自带有forloop函数,只有我们用循环的时候.这个方法就可以直接调用.因为他是内嵌在模板语言里的.我们可以直接使用 官网地址上,可以了解更多的模板语言的学习. 官网地址:https://docs.djangoproject.com/zh-hans/2.1/

django常用模板语言

一.变量 django模板接收到从后端传来的参数,放入模板中对应的变量中 #django代码 def info(request): .... return render(request,'info.html',{'key1':vul1,'key2':vul2}) #HTML代码<div>{{ key1 }}</div> <div>{{ key2 }}</div> HTML中变量要与django传递的代码key值相同 原文地址:https://www.cnbl

django 模板语言

Django的模板语言的目的是取得力量和易用性之间的平衡,与其他的模板语言相比,django模板语言显得更简单,更专一, django模板系统由模板,变量,过滤器,标签,注释等主要部分组成 模板 一个模板是一个简单的文本文件,它可以生成任何基于文本的格式,html,csv,xml等等 模板里面包含变量,过滤器,标签和注释,下面是一个简单的模板文件 {% extends "base_generic.html" %} {% block title %}{{ section.title }}

Django模板语言相关内容

Django模板系统 官方文档:https://docs.djangoproject.com/en/1.11/ref/templates/builtins/#std:templatetag-for 常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 {{ 变量名 }} 变量名由字母数字和下划线组成. 点(.)在模板语言中有特殊的含义,用来获取对象的相应属性值. 几个例子: view中代码: def template_test(requ

59 Django基础三件套 , 模板{{}}语言 , 程序连mysql Django项目app Django中ORM的使用

主要内容: 1 form表单中提交数据的三要素 form标签必须要有action和method的属性 所有获取用户输入的标签必须放在form表单里,也必须要有那么name属性.因为往后端提交数据的时候name所对应的是关键字, input输入的值为value.在后端显示为字典的模式, 如果不写name关键字,则取不到值. 必须要有submit按钮. 2 Django 基础三件套 from Django.shortcuts import HttpResponse, render, redirect

Django模板语言

常用语法 {{  }}和{% %} 变量相关的用{{}} , 逻辑相关的用{% %} 变量 在Django的模板语言中按此语法使用:{{ 变量名 }}. 当模版引擎遇到一个变量,它将计算这个变量,然后用结果替换掉它本身. 变量 的命名包括任何字母数字以及下划线 ("_")的组合(不提倡数字开头). 变量名称中 不能有空格或标点符号. 点(.)在模板语言中有特殊的含义.当模版系统遇到点("."),它将以这样的顺序 查询: 字典查询(Dictionary lookup)

Django模板语言-Filters(过滤器)

Filters(过滤器) 在Django的模板语言中,通过使用 过滤器 来改变变量的显示. 过滤器的语法: {{ value|filter_name:参数 }} 使用管道符"|"来应用过滤器. 例如:{{ name|lower }}会将name变量应用lower过滤器之后再显示它的值.lower在这里的作用是将文本全都变成小写. 注意事项: 过滤器支持“链式”操作.即一个过滤器的输出作为另一个过滤器的输入. 过滤器可以接受参数,例如:{{ sss|truncatewords:30 }}