Django 模板

创建模板

  在 polls 应用目录下创建一个 templates 目录。Django 将会在这个目录里查找模板文件。

  mysite/settings.py 的 TEMPLATES 配置项描述了 Django 如何载入和渲染模板。默认的设置文件设置了 DjangoTemplates 后端,并设置 APP_DIRS =True。这一选项将会让 DjangoTemplates 在每个 INSTALLED_APPS 文件夹中寻找 templates 子目录。

  新建一个模板文件 polls/templates/polls/index.html,并添加如下代码:

{% if question_list %}
<ul>
  {% for question in question_list %}
    <li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>
  {% endfor %}
</ul>
{% else %}
  <p>No polls are available.</p>
{% endif %}

  然后,我们在 polls/views.py 里创建一个 index() 视图函数来使用模板:

def index(request):
    question_list = Question.objects.all()
    return render(request, 'polls/index.html', {'question_list': question_list})

  render() 函数把 request 对象作为它的第一个参数,模板作为第二个参数,字典作为可选的第三个参数。传递给模板一个 HttpResponse 对象。

  最后将新视图添加进 polls.urls 模块:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
]

模板语言

  模板是由HTML代码和逻辑控制代码组成,用来分离一个文档(通常是HTML)的表现形式和内容。

1. 变量

变量的形式: {{ variable }}

使用 "." 访问变量的属性。

  当 templates 引擎遇到变量时,引擎使用变量的值代替变量。当 templates 引擎遇到 "." 的时候,会按照如下顺序查询:

字典查询,比如 foo["bar"]

属性或方法查询,比如 foo.bar 或 foo.bar()

数字索引查询,比如 foo[bar]

  如果变量不存在,模版系统将插入空字符串。在模板中调用方法时,不能传递参数给方法。

2. 标签

  标签的形式: {% tag %}

(1)if 标签

{% if 判断条件 %}

执行语句

{% elif 判断条件 %}  #可选

执行语句

{% else %}  #可选

执行语句

{% endif %}

  {% if %} 标签接受 and,or 或 not 关键字来对多个变量做判断。在同一个标签中可以同时使用 and 或同时使用 or,但不能混合使用。

(2)ifequal/ifnotequal 标签

  {% ifequal %} 标签比较两个值,如果他们相等,显示在 {% ifequal %} 和 {% endifequal %} 之间的所有代码。

(3)for 标签

{% for ... in ... %}
执行语句
{% empty %}  #可选
执行语句
{% endfor %}
  在{% for %}标签中,可以访问 forloop 变量,该变量有几个常用的属性:

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

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

forloop.revcounter:表示当前循环剩余的元素数量,最后一次循环时,值为1。

forloop.revcounter0:表示当前循环剩余的元素数量,最后一次循环时,值为0。

forloop.first:布尔值,是否为第一次循环。

forloop.last:布尔值,是否为最后一次循环。

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

注意,forloop 变量只在循环内部可用。模板解析器遇到 {% endfor %} 时,forloop 随之消失。

(4)注释标签

  单行注释:{# 这是一个注释 #}

  多行注释:{% comment %} 和 {% endcomment %}

(5)include 标签

  {% include %} 标签允许在模板中包含其它的模板的内容。

(6)csrf_token 标签

  {% csrf_token %} 标签用于跨站请求伪造保护。

(7)filter 标签

  {% filter %} 标签通过一个或多个过滤器对内容过滤,多个过滤器使用管道符号相连接,且过滤器可以有参数。

(8)autoescape 标签

  {% autoescape off %} 用于某块内容不需要自动转义。

(9)block 标签

  {% block %} 定义一个块,该块能够被继承他的子模板重写。

(10)extends 标签

  {% extends %} 子模块用来继承父模块。

(11)url 标签

  {% url %} 引用路由配置的地址。

(12)load 标签

  {% load staticfiles %} 加载静态文件。

3. 过滤器

  模板过滤器可以在变量显示前修改它,过滤器使用管道字符,比如:{{ name|lower }}

模板继承

  模板继承就是先构造一个基础框架模板,而后在其子模板中对它所包含站点公用部分和定义块进行重载。模板引擎发现了 {% extends %} 标签, 注意到该模板是一个子模板,模板引擎立即装载其父模板。

 

posted @ 2019-03-21 10:30  PIPO2  阅读(186)  评论(0编辑  收藏  举报