Django模板标签
模板文件(templates)一般位于新创建的APP目录下面,Django会自动去这个文件夹中找
1.Django模板查找机制
Django 查找模板的过程是在每个 app 的 templates 文件夹中找,而不只是当前 app 中的templates 文件夹中找。各个 app 的 templates 形成一个文件夹列表,Django 遍历这个列表,一个个文件夹进行查找,当在某一个文件夹找到的时候就停止,所有的都遍历完了还找不到指定的模板的时候就是 Template Not Found (过程类似于Python找包)。
例如:项目 zqxt 有两个 app,分别为 tutorial 和 tryit
zqxt
├── tutorial
│ ├── __init__.py
│ ├── admin.py
│ ├── models.py
│ ├── templates
│ │ └── tutorial
│ │ ├── index.html
│ │ └── search.html
│ ├── tests.py
│ └── views.py
├── tryit
│ ├── __init__.py
│ ├── admin.py
│ ├── models.py
│ ├── templates
│ │ └── tryit
│ │ ├── index.html
│ │ └── poll.html
│ ├── tests.py
│ └── views.py
├── manage.py
└── zqxt
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
这样,使用的时候,模板就是 “tutorial/index.html” 和 “tryit/index.html” 这样有app作为名称的一部分,就不会混淆。
2.Django的上下文渲染器
如果需要将一个或多个变量共享给多个网页或者所有网页使用,这个可以使用 Django 上下文渲染器来做。
**简单总结一下:**一般的变量之类的用 {{ }}(变量),功能类的,比如循环,条件判断是用 {% %}(标签)
(1)显示一个基本的字符串在网页上
from django.shortcuts import render
def home(request):
s = u"我在自强学堂学习Django,用它来建网站"
return render(request, 'home.html', {'string': s})
home.html
{{ string }}
(2)基本的 for 循环
from django.shortcuts import render
def home(request):
TutorialList = ["HTML", "CSS", "jQuery", "Python", "Django"]
return render(request, 'home.html', {'TutorialList': TutorialList})
home.html
{% for i in TutorialList %}
{{ i }}
{% endfor %}
(3)显示字典中的内容
def home(request):
info_dict = {'site': u'自强学堂', 'content': u'各种IT技术教程'}
return render(request, 'home.html', {'info_dict': info_dict})
home.html
{% for key, value in info_dict.items %}
{{ key }}: {{ value }}
{% endfor %}
(4)条件判断
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 |
当列表中可能为空值时用 {% empty %}
<ul>
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% empty %}
<li>抱歉,列表为空</li>
{% endfor %}
</ul>
(5)模板上得到视图对应的网址
{% url ‘网址名称’ 参数1 参数2 参数3… %}
还可以使用 as 语句将内容取别名(相当于定义一个变量),多次使用(但视图名称到网址转换只进行了一次)
{% url '网址名称' arg1 arg2 as the_url %}
<a href="{{ the_url }}">链接到:{{ the_url }}</a>
(6)逻辑操作
==, !=, >=, <=, >, < 这些比较都可以在模板中使用
{% if var >= 90 %}
成绩优秀,自强学堂你没少去吧!学得不错
{% elif var >= 80 %}
成绩良好
{% elif var >= 70 %}
成绩一般
{% elif var >= 60 %}
需要努力
{% else %}
不及格啊,大哥!多去自强学堂学习啊!
{% endif %}
(7)获取当前用户
{{ request.user }}
如果登陆就显示内容,不登陆就不显示内容:
{% if request.user.is_authenticated %}
{{ request.user.username }},您好!
{% else %}
请登陆,这里放登陆链接
{% endif %}
(8)获取当前网址
{{ request.path }}
(9)获取当前GET参数
{{ request.GET.urlencode }}
合并到一起用
<a href="{{ request.path }}?{{ request.GET.urlencode }}&delete=1">当前网址加参数 delete</a>
完整的内容参考官方文档:https://docs.djangoproject.com/en/1.11/ref/templates/builtins/