排序
1、forloop.counter 表示循环的次数,它从1开始计数,第一次循环设为1
{% for item in todo_list %} <p>{{ forloop.counter }}: {{ item }}</p> {% endfor %}
2、forloop.counter0 表示循环的次数,它从0开始计数,第一次循环设为0
{% for item in todo_list %} <p>{{ forloop.counter0 }}: {{ item }}</p> {% endfor %}
3、forloop.revcounter 示循环中剩下的items数量,第一次循环时设为items总数,最后一次设为1
{% for item in todo_list %} <p>{{ forloop.revcounter }}: {{ item }}</p> {% endfor %}
4、forloop.revcounter0 类似于forloop.revcounter,但它是表示的数量少一个,即最后一次循环时设为0
{% for item in todo_list %} <p>{{ forloop.revcounter0 }}: {{ item }}</p> {% endfor %}
5、forloop.first 当第一次循环时值为True,在特别情况下很有用)
{% for object in objects %} {% if forloop.first %}<li class="first">{% else %}<li>{% endif %} {{ object }} </li> {% endfor %}
6、forloop.last 当最后一次循环时值为True
{% for link in links %}{{ link }}{% if not forloop.last %} | {% endif %}{% endfor %}
7、forloop.parentloop 在嵌套循环中表示父循环的forloop:
{% 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 %}
继承
1、模板继承允许你建立一个基本的”骨架”模板, 它包含你所有最常用的站点元素 并 定义了一些可以被子模板覆盖的block
父模板(master.html):
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{% block title %}{% endblock %}</title> <style> .body-header{ background-color: black; } </style> </head> <body>
HTML页面:
{# 指定继承的模板 #} {% extends 'master.html' %} {# 指定替换的位置 #} {% block title %} tp1 {% endblock %} {# 指定替换的位置 #} {% block content %} <p>tp1</p> {% endblock %}
注:一个html页面只能继承一个父模板,不能继承多个
2、模板导入定制的组件include
组件(tag.html):
form> <input type="text" name="user"/> <input type="submit" value="提交"/> </form>
HTML页面:
{# 指定继承的模板 #} {% extends 'master.html' %} {# 指定替换的位置 #} {% block title %} tp1 {% endblock %} {# 指定替换的位置 #} {% block content %} <p>tp1</p> {# 导入单独组件 #} {% include 'tag.html' %} {% endblock %}
Simplelistfilter
有时候我们需要在html上对后台渲染的页面进行二次处理,比如把字符串的首字母大写、字符进行计算操作等
1、django默认自带方法
{{ item.event_start|date:"Y-m-d H:i:s"}} #日期格式进行转换 {{ bio|truncatewords:"30" }} #取字符串前30位 {{ my_list|first|upper }} #第一个字符大写 {{ name|lower }} #所有字符小写
2、自定义simple_tag、filter
① 在app中创建templatetags文件夹
② templatetags中创建任意 .py 文件,如:handle.py
from django import template from django.utils.safestring import mark_safe register = template.Library() @register.simple_tag() def sub(a1,a2): #能添加多个参数 return a1 + a2 @register.filter() def lzl(a1,a2): #只能传入两个参数 return a1 + a2
③ 在settings中配置当前app,不然django无法找到自定义的simple_tag
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'cmdb', )
④ 导入和使用simple_tag、filter
{# 导入py文件名 #} {% load handle %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div>{{ name|lower }}</div> <div>{{ name|upper }}</div> {% sub 1 2 %} {{ 'hello'|lzl:'world'}} </body> </html> {#页面内容#} {#3 helloworld#}
3、django数据库choice获取字段
device_status_choices = ( (1, '上架'), (2, '在线'), (3, '离线'), (4, '下架'), ) device_type_id = models.IntegerField('设备类型',choices=device_type_choices, default=1) <td colspan="4">{{ response.data.asset.get_device_status_id_display }}</td>
详细-》》http://www.cnblogs.com/mfryf/archive/2012/07/17/2595019.html
《第二十章》