08-django-templates

templates

在所有 app 目录下的 templates 文件夹中寻找

  • For more details
  • 项目目录下的 settings.pyTEMPLATES 列表中的 DIRS 属性中可以配置搜索根目录: os.path.join(BASE_DIR, "templates")
  • 如果根目录中没有找到, 则再去各个 APP 中寻找
  • 寻找顺序按照 APP 注册的先后, APP 内推荐目录结构为: app_name/templates/app_name/template.html 即多建一层以 APP 命名的目录, 以声明 template 文件的命名空间

传统渲染方式

1
2
3
4
5
6
7
8
9
10
11
from django.template import loader
from .models import Question

def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]

template = loader.get_template("polls/index.html")
context = {
"latest_question_list": latest_question_list,
}
return HttpResponse(template.render(context, request))

快速渲染方式

使用 django.shortcutsrender 实现模板的快速渲染命令

1
2
3
4
5
6
7
from django.shortcuts import render

def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]

context = { "latest_question_list": latest_question_list}
return render(request, "polls/index.html", context)

模板语法

  • 变量值: {{ var }}
  • 数组索引: {{ arr.index }}
  • 字典属性: {{ dict.key }}
  • 日期: {{ user.create_time | date:"Y-m-d H:i:s" }}

循环

  • 数组循环:
{% for item in arr %}
<span>{{ item }}</span>
{% endfor %}
  • 字典循环: 同 python, dict.keys, dict.values, dict.items, 就是不用加括号了
{% for key, value in dict.items %}
<span>{{ item }}</span>
{% endfor %}

条件

  • if [elif] else
1
2
3
4
5
6
7
{% if name == "admin" %}
pass
{% elif name == "user" %}
pass
{% else %}
pass
{% endif %}

模板继承

  • 根模板中: 配置好占位符
{% block content %}{% endblock %}
  • 子模板中: 继承根模板+ 填充占位符
1
2
3
4
5
6
{% extends 'OA/layout.html' %}

...
{% block content %}
...
{% endblock %}

静态文件引入

django 将静态文件放置再 app 下的 static 目录下统一管理(配置文件中管理), 内部用户再自行创建文件夹进行规整

1
2
3
4
{% load static %}
<link rel="stylesheet" href="{% static 'plugins/bootstrap-4.3.1-dist/css/bootstrap.css' %}">
<script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
<script src="{% static 'plugins/bootstrap-4.3.1-dist/js/bootstrap.js' %}"></script>

非硬编码 URL

在 urlpattern 中配置的 name 属性, 就可以用在模板语法中用于索引想要跳转的 url, 而不必再用拼接的形式, 如 <a href="/polls/{{ question.id }}/">

模板标签为 {% url %} 以空格为分隔符, 第一个参数表示目标 url 的 name, 后续参数为参数列表

<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>

如果要传递 GET 参数则在模板后面拼接即可

<a href="{% url 'OA:depart_delete' %}?depart_id={{depart.id}}" >删除</a>