Django - templates(模板)
1. 简介
templates 的中文意思就是模板, 在django项目中该文件夹下是专门存放html文件的, 每一个html文件就是一个模板。模板是用来显示网页用的,在views.py文件中我们可以定义使用模板的方法。下面就来写一些干货。
2. 模板中循环、条件判断、常用标签、过滤器的使用
循环: 迭代显示列表、字典等中的内容
条件判断:判断是否显示该内容
标签:for, if这样的功能都是标签
过滤器: 管道后面的功能。,比如{{var|length}},求变量长度的length就是一个过滤器
字符串传入模板:
def home(request): string = "我在学习Django" return render(request, 'home.html', {'string': string}) 在模板中这样使用方式: {{ string }}
for循环和list:
def home(request): TutorialList = ["HTML", "CSS", "jQuery", "Python", "Django"] return render(request, 'home.html', {'TutorialList': TutorialList}) 在模板中使用方式: {% for i in TutorialList %} {{ i }} {% endfor %}
字典传入模板:
def home(request): info_dict = {'site': '自强学堂', 'content': '各种IT技术教程'} return render(request, 'home.html', {'info_dict': info_dict}) 在模板中使用使用: {{ info_dict.site }} {{ info_dict.content }} 在模板中取字典的键是用点info_dict.site,而不是 Python中的 info_dict['site'] 遍历字典: {% for key, value in info_dict.items %} {{ key }}: {{ value }} {% endfor %}
条件判断和for循环的详细操作:
def home(request): List = map(str, range(100))# 一个长度为100的 List 假如我们想用逗号将这些元素连接起来: {% for item in List %} {{ item }}, {% endfor %} 但是最后一个元素后面也有一个逗号,这样肯定不爽, 如果判断是不是遍历到了最后一个元素了呢? 用变量 forloop.last 这个变量,如果是最后一项其为真,否则为假,更改如下: {% for item in List %} {{ item }} {% if not forloop.last %} , {% endif %} {% endfor %} 在for循环中还有很多有用的东西,如下: forloop.counter 索引从 1 开始算 forloop.counter0 索引从 0 开始算 forloop.revcounter 索引从最大长度到 1 forloop.revcounter0 索引从最大长度到 0 forloop.first 当遍历的元素为第一项时为真 forloop.last 当遍历的元素为最后一项时为真 forloop.parentloop 用在嵌套的 for 循环中,获取上一层 for 循环的 forloop 当列表中可能有个元素为空值时用 for empty <ul> {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% empty %} <li>抱歉,列表为空</li> {% endfor %} </ul>
模板上得到对应视图的网址:
# 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/ 还可以使用 as 语句将内容取别名(相当于定义一个变量), 多次使用(但视图名称到网址转换只进行了一次) {% url 'some-url-name' arg arg2 as the_url %} <a href="{{ the_url }}">链接到:{{ the_url }}</a>
模板中的逻辑操作:
==, !=, >=, <=, >, < 这些比较都可以在模板中使用,比如: {% 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 %} 假如我们判断 'ziqiangxuetang' 在不在一个列表变量 List 中: {% if 'ziqiangxuetang' in List %} 自强学堂在名单中 {% endif %}
模板中 获取当前网址,当前用户等:
修改 settings.py TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ ... 'django.template.context_processors.request', ... ], }, }, ] 然后在 模板中我们就可以用 request 了 获取当前用户: {{ request.user }} 如果登陆就显示内容,不登陆就不显示内容: {% if request.user.is_authenticated %} {{ request.user.username }},您好! {% else %} 请登陆,这里放登陆链接 {% endif %} 获取当前网址: {{ request.path }} 获取当前 GET 参数: {{ request.GET.urlencode }} 合并到一起用的一个例子: <a href="{{ request.path }}?{{ request.GET.urlencode }} &delete=1">当前网址加参数 delete</a> 我们可以判断 delete 参数是不是 1 来删除当前的页面内容。
简单总结下:一般变量之类的用{{}}(变量),功能类的, 比如循环,条件判断使用{% %}(标签)
过滤器
date
年: y 两位年 Y 四位年 月: m 日: d 时:h 12小时制 H 24小时制 分:m 秒:s
注释
{# #} 模板中单行注释 {% comment %} {% endcomment %} 模板中多行注释
大小写
upper lower
乘或者除
widthratio 数 分母 分子
整除2,返回True,反之False
divisibleby:2
namespace和name使用
{% url 'namespace:name' value1 %} 工程url中定义namespace 模块appurl中定义name
3. include(包含)和 extends(拓展或者继承)
网站模板的设计,一般都会有一些通用的部分,像导航,底部,访问统计代码等。
nav.html, bottom.html, tongji.html
包含(include):
base.html包含 nav.html, bottom.html, tongji.html
继承(extends):
nav.html, bottom.html, tongji.html 继承 base.html
挖坑:
base.html: <!DOCTYPE html> <html> <head> <title>{% block title %}默认标题{% endblock %}</title> </head> <body> {% include 'nav.html' %} {% block content %} <div>这里是默认内容,所有继承自这个模板的,如果不覆盖 就显示这里的默认内容。</div> {% endblock %} {% include 'bottom.html' %} {% include 'tongji.html' %} </body> </html>
填坑:
nav.html: 把原有的html格式删除,然后内容为 {% block title %} 文本内容 {% endblock %} {% block contains %} 文本内容 {% endblock %}
包含与继承(extends):形式刚好相反
Django 模板查找机制: Django 查找模板的过程是在每个 app 的 templates 文件夹中找(而不只是当前 app 中的代码只在当前的 app 的 templates 文件夹中找)。各个 app 的 templates 形成一个文件夹列表,Django 遍历这个列表,一个个文件夹进行查找,当在某一个文件夹找到的时候就停止