模板语言if/else/endif

{% if today_is_weekend %}
<p>Welcome to the weekend!</p>
{% else %}
<p>Get back to work.</p>
{% endif %}

解释:当变量:today_is_weekend 为真,返回:<p>Welcome to the weekend!</p> ,否则返回:<p>Get back to work.</p>

模板语言循环
1:如果模板语言遇到列表,直接进行循环取值即可。
2:如果模板语言遇到字典进行循环有以下3种:
  - for item in dict.keys 只循环获取字典key
  - for item in dict.value 只循环获取字典value
  - for k,v in dict.items 循环获取字典的key,value全部。
实例url:fordict # 字典for循环的取值方法

 userlist = {
'': {'name': 'jack', 'age': 36},
'': {'name': 'anna', 'age': 26},
'': {'name': 'vivi', 'age': 16},
}
def fordict(request):
return render(request,'dict_for.html',{'ulist':userlist})
 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>循环字典</title>
</head>
<body>
<div>
{% for k in ulist.keys %}
<div>字典key:{{ k }}</div>
{% endfor %}
<hr />
{% for v in ulist.values %}
<div>字典value:{{ v }}</div>
{% for k1,v1 in v.items %}
<div>字典k - v: {{ k1 }} -- {{ v1 }}</div>
{% endfor %}
{% endfor %}
<hr />
{% for k,v in ulist.items %}
<div>字典k - v:{{ k }} - {{ v }}</div>
{% endfor %}
<hr />
<hr />
{% for k,v in ulist.items %}
{# <div><a href="/detail?nid={{ k }}">{{ v.name }}</a></div>#}
<div><a href="/detail-{{ k }}.html">{{ v.name }}</a></div>
{% endfor %}
</div>
</body>
</html>

HTML

实例url:detail # 查看详情

 url写法
# url(r'^detail',views.detail),
# url(r'^detail-(\d+).html',views.detail), # 正则写法
url(r'^detail-(?P<nid>\d+).html',views.detail), # 正则分组写法 视图函数
def detail(request,nid):
# nid = request.GET.get('nid')
curr_info = userlist[nid]
return render(request,'detail.html',{'detail_info':curr_info})
 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>详细信息</title>
</head>
<body>
<form action="/index" method="post">
<input type="text" name="user" placeholder="用户名" />
<input type="text" name="email" placeholder="email" />
<input type="submit" value="提交" />
</form>
<ul>
{% for k,v in detail_info.items %}
<li>{{ k }} -- {{ v }}</li>
{% endfor %}
</ul>
</body>
</html>

HTML

使用:reversed 对列表进行反向迭代

{% for athlete in athlete_list reversed %}
...
{% endfor %}

使用:{% empty %} 的可选参数检测列表是否为空

{% for athlete in athlete_list %}
<p>{{ athlete.name }}</p>
{% empty %}
<p>There are no athletes. Only computer programmers.</p>
{% endfor %}

以下为 for 循环里 forloop模板变量的个别使用和属性说明:

说明:forloop的变量只能在for循环引用。

forloop.counter:当前循环的执行次数的整数计数器,默认从1开始。

{% for item in todo_list %}
<p>{{ forloop.counter }}: {{ item }}</p>
{% endfor %}

forloop.counter0:当前循环的执行次数从 0 开始计数。

forloop.revcounter :初始执行计数为序列数的总数,最后一次循环计数为1,也就是counter的逆序。

forloop.revcounter0 :功能同上,不同点是列数总数减1.

forloop.first:是一个布尔值,迭代第一次执行置为空

{% for object in objects %}
{% if forloop.first %}<li class="first">{% else %}<li>{% endif %}
{{ object }}
</li>
{% endfor %}

forloop.last:是一个布尔值,循环最后一次执行置为:True,常见用法是一系列链接之间放置管道符。如下:

{% for link in links %}{{ link }}{% if not forloop.last %} | {% endif %}{% endfor %}
输入: Link1 | Link2 | Link3 | Link4 这里无管道符

forloop.parentloop :是一个指向当前循环的上一级循环对象的引用。

{% for country in countries %}
<table>
{% for city in country.city_list %}
<tr>
<td>Country #{{ forloop.parentloop.counter }}</td> # 循环的上一级
<td>City #{{ forloop.counter }}</td>
<td>{{ city }}</td>
</tr>
{% endfor %}
</table>
{% endfor %}

ifequal / ifnotequal

ifequal:比较2个值,如果相等,则显示{% ifequal%} 和 {% endifequal%} 之间的数据。可选标签{% else %}实例如下:

比较2个模板变量:user , currentuser

{% ifequal user currentuser %}
<h1>Welcome!</h1>
{% endifequal %}

注意:ifequal 只支持模板变量,字符串,整数,小数, 其他类型不支持。

过滤器:在模板变量被显示前修改它的值的一个简单方法,使用管道符:( | )

如:{{ name|lower }} :变量name的值被过滤器处理后,显示的值转换为小写。

过滤器参数:跟随冒号之后并用双引号包含,如:{{ bio|truncatewords:"30" }}: 显示变量bio 的前30个字符

重要的过滤器:

addslashes : 添加反斜杠到任何反斜杠、单引号或者双引号前面。 这在处理包含JavaScript的文本时是非常有用的。

date : 按指定的格式字符串参数格式化 date 或者 datetime 对象, 如:{{ pub_date|date:"F j, Y" }}

length : 返回变量的长度。 对于列表,这个参数将返回列表元素的个数。 对于字符串,这个参数将返回字符串中字符的个数。

include 模板标签

{% include %}:该标签允许包含其他的模板内容,标签的参数是所要包含的模板名称,可以是一个变量,也可以是用单/双引号硬编码的字符串。当多个模板出现相同代码的同时,就要使用{% include %} 来减少代码的重复量。如:

{% include 'nav.html' %}
{% include "nav.html" %}
{% include template_name %}  参数也可以是一个变量

3:模板继承(实例包含titil,css content,js)

{% extends %}:必须保证其为模板中的第一个模板标记。 否则,模板继承将不起作用。

{% block %}:所有的 {% block %} 标签告诉模板引擎,子模板可以重载这些部分。

{{ block.super }}:这个变量将会表现出父模板中的内容。 如果只想在上级代码块基础上添加内容,而不是全部重载,该变量就显得非常有用了

继承的一种常见方式是下面的三层法:

  1. 创建 base.html 模板,在其中定义站点的主要外观感受。 这些都是不常修改甚至从不修改的部分。

  1. 为网站的每个区域创建 base_SECTION.html 模板(例如, base_photos.html 和 base_forum.html )。这些模板对 base.html 进行拓展,并包含区域特定的风格与设计。

  1. 为每种类型的页面创建独立的模板,例如论坛页面或者图片库。 这些模板拓展相应的区域模板。

实例:master.html 母版

 {% block func %}{% endblock %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block tital %}{% endblock %}</title>
<link rel="stylesheet" href="/static/commons.css" />
{% block css %}{% endblock %}
</head>
<body> <h1>母版继承</h1>
{% block content %}{% endblock %}
<script src="/static/jquery-1.12.4.min.js"></script>
{% block js %}{% endblock %}
</body>
</html>

母板

实例:slave.html 继承版

 {% extends 'master.html' %}
{% load func1 %}
{% block tital %}继承版{% endblock %}
{% block css %}
<style>
body{ background:#eeeeee}
</style>
{% endblock %}
{% block content %}
<h2>继承版本</h2>
{% include 'tag.html' %}
{% include 'tag.html' %}
{% include 'tag.html' %}
{% include 'tag.html' %}
{% count 20 40 %}
{% endblock %}
{% block js %}
<script>alert('js继承')</script>
{% endblock %}

继承版

注意:继承一个网页只能继承一个模板
4:模板导入
在html文件中使用:{% include 'tag.html' %} 可以将tag.html网页内容导入到文件中。
5:自定义函数
simple_tag
1:在app下创建templatetags目录
2:在此目录下建立任意xxx.py文件
3:在py文件中注册simple_tag,以下为固定写法,不能修改
  from django import template
  register = template.Library() # 创建template对象,
  @register.simple_tag
  def func(a1,a2,a3..):
    return "str..."
4:settings中注册app
5:在需要引入的html文件的顶部载入py文件,{% load xxx %}
6:html文件中使用:{% 函数名 arg1 arg2... %}
优点:支持多个参数传入
缺点:不能应用到条件判断中
filter
1:在app下创建templatetags目录
2:在此目录下建立任意xxx.py文件
3:在py文件中注册simple_tag,以下为固定写法,不能修改
  from django import template
  register = template.Library() # 创建template对象,
  @register.filter
  def func(a1,a2):
    return "str..."
4:settings中注册app
5:在需要引入的html文件的顶部载入py文件,{% load xxx %}
6:html文件中使用:{{ arg1|函数名:arg2 }}
优点:可以应用在条件判断中 {% if "china"|cstr:'beijing' %} {% endif %}
缺点:只支持2个参数传入,不能加空格
如:simple_tag 和 filter

 from django import template
register = template.Library()
@register.simple_tag
def count(a1,a2,a3):
num = a1 + a2 + a3
return num
@register.filter
def cstr(a1,a2):
num = a1 + a2
return num
@register.filter
def power(a1):
return a1.upper()

html文件对应写法

 {% load func1 %} # 导入py文件
<!DOCTYPE html>
<html lang="en">
<head></head>
<body>
{% count 10 20 %} # 对应simple_tag输出30
{{ "china"|cstr:'beijing' }} # 对应filter输出chinabeijing
{{ 'china'|power }} #转换为大写
</body>

Django学习之 - 基础模板语言的更多相关文章

  1. Django学习笔记之模板

    模板 模板介绍 在之前的章节中,视图函数只是直接返回文本,而在实际生产环境中其实很少这样用,因为实际的页面大多是带有样式的HTML代码,这可以让浏览器渲染出非常漂亮的页面. 目前市面上有非常多的模板系 ...

  2. Django学习之 - 基础部分

    学习记录参考: 讲师博客:http://www.cnblogs.com/wupeiqi/articles/5433893.html 老男孩博客:http://oldboy.blog.51cto.com ...

  3. Django中级篇之模板语言

    模板 一.引用变量 模版的创建过程,对于模版,其实就是读取模版(其中嵌套着模版标签),然后将 Model 中获取的数据插入到模版中,最后将信息返回给用户. {{ xxx }} 二.标签 用{%  %} ...

  4. Django学习日记04_模板_overview

    通过Django中的模板,使得设计人员和网站管理有一个对接的接口,实现网页设计和逻辑的分离,因此,模板会处理大量的文本解析内容,django中内部使用了高效的引擎来完成模板解析. 模板设置 在使用模板 ...

  5. Django实战(二)之模板语言

    该实战教程基于菜鸟教程,菜鸟教程可参考:http://www.runoob.com/django/django-template.html 模板语法,每个框架都有其支持的模板语法,Django的模板语 ...

  6. Django学习之 - 基础路由系统

    路由系统:URL 1:一个URL对应一个类或函数: url(r'^register',reg.register) 函数写法 url(r'^cbv',reg.cbv.as_view()) 类写法 2:通 ...

  7. Django学习系列之模板系统

    一.模板标签 if/else {%  if  %}标签检查一个变量的值是否为真或者等于另外一个值,如果为真,系统会执行{%  if  %}和{%  endif  %}之间的代码块,例如: {% if ...

  8. Django学习系列之模板

    什么是django模板 模板是一个文本,用于分离文档的表现形式和内容,模板定义了占位符以及各种用于规范文档该如何显示的各部分基本逻辑(模板标签) 模板通常用于产生HTML 如何使用模板 创建一个Tem ...

  9. Django学习笔记之模板渲染、模板语言、simple_tag、母版子版、静态配置文件

    一.首先我们用PyCharm来创建一个Django项目 终端命令:django-admin startproject sitename 图形创建:   这样一个Django项目就创建完成了,上面可以看 ...

随机推荐

  1. iOS 利用UIWebView与JavaScript交互的最简单办法

    这里说的是针对iOS的!并且方法很简单!!并且验证可行的!!! 1, UIWebView调用 JavaScript 的函数: NSString* strValue = [webView stringB ...

  2. like SQL注入与防止 (bin2hex unhex)

    普通的列表模糊查询,可能会被sql注入利用,造成数据泄漏,严重的甚至导致删表删库! 程序中sql语句拼装: $sql = 'student_name like '"%'.$name.'%&q ...

  3. Java URL 中文乱码解决办法

    一. 统一所有的编码格式 (1)JSP页面设置:<%@ page language="java" import="java.util.*" pageEnc ...

  4. JDBC优化策略总结

    相比Hibernate.iBatis.DBUtils等,理论上JDBC的性能都超过它们.JDBC提供更底层更精细的数据访问策略,这是Hibernate等框架所不具备的.   在一些高性能的数据操作中, ...

  5. ubuntu服务器切换语言

    如果在安装Ubuntu Server时选择了中文,在系统安装完毕后,默认是中文,在操作时经常会显示乱码,如果需要设置回英文,则修改/etc/default/locale,将 LANG="cn ...

  6. HTML5应用 + Cordova = 平台相关的混合应用

    Jerry之前的一篇文章 SAP Fiori应用的三种部署方式 曾经提到SAP Fiori应用的三种部署方式: On Premise环境下以ABAP BSP应用作为Fiori应用部署和运行的载体 部署 ...

  7. Django请求,响应,ajax以及CSRF问题

    二.request对象常用属性: Attribute Description path 请求页面的全路径,不包括域名端口参数.例如: /users/index method 一个全大写的字符串,表示请 ...

  8. Windows SubSystem for Linux(WSL)设置默认和设置默认登陆用户

    使用wslconfig命令进行管理 1.  设置默认运行的linux系统 wslconfig /setdefault <DistributionName> 正如上面所说,如果执行wslco ...

  9. Windows下使用ffmpeg与java实现截取视频缩略图

    [ffmpeg.exe可执行文件获取]: 网上搜索后得到编译好的ffmpeg文件,下载地址:http://download.csdn.net/source/453719 [安装]: 将下载的文件解压, ...

  10. Linux Shell参数扩展(Parameter Expansion)

    Shell Command Language在线文档: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html ...