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)显示一个基本的字符串在网页上

views.py

from django.shortcuts import render
def home(request):
    s = u"我在自强学堂学习Django,用它来建网站"
    return render(request, 'home.html', {'string': s})

home.html

{{ string }}

(2)基本的 for 循环

views.py

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)显示字典中的内容

views.py

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/