django3基础入门-p04-模板层Template

模板引擎的支持

模板引擎是通过 TEMPLATES 进行配置。这是一个配置列表,每个引擎都有一个

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            # ... some options here ...
        },
    },
]

BACKEND:要使用的模板后端,内置的模板后端有:

  • 'django.template.backends.django.DjangoTemplates'
  • 'django.template.backends.jinja2.Jinja2'

DIRS:按照搜索顺序,引擎应该查找模板源文件的目录。

APP_DIRS:引擎是否应该在已安装的应用程序中查找模板源文件。

Django 模板语言

Django 模板是使用 Django 模板语言标记的一个文本文档或Python字符串。

一个模板包含 变量标签,前者在模板被执行时被替换为值,后者控制模板的逻辑。

变量

变量从上下文中输出一个值,上下文是一个类似于字典的对象,将键映射到值。

变量被 {{` 和 `}} 包围,如{{变量名}}

使用点号(.)来访问一个变量的属性,如 {{变量名.某某属性}}

标签

标签在渲染过程中提供了任意逻辑。

标签被 {%` 和 `%} 包围,如 {% tag %}` 有些标签要求有开始和结束标签,如 `{% tag %}...tag contents...{% endtag %}

过滤器

过滤器转换变量和标签参数的值。

{{ django|title }}

注释

单行注释:{# this won't be rendered #}

多行注释:忽略 {% comment %}` 和 `{% endcomment %}之间的所有内容。

模板使用示例

  • 视图函数 djstart/app_demo/views.py
def blog_list_view(request):
    blog_list = Blog.objects.all()
    count = Blog.objects.count()
    context = {"blog_list":blog_list,"count":count}
    return render(request,'app_demo/blog_list.html',context=context)
  • 模板djstart/app_demo/templates/app_demo/blog_list.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>blog列表页</title>
</head>
<body>
<h1>blog列表</h1>
<ul>
    {% for blog in blog_list %}
        <li> {{ blog.name }} - {{ blog.tagline }} - {{ blog.logo }} </li>
    {% endfor %}
</ul>
<div>博客总数:{{ count }}</div>
</body>
</html>

image-20220328152902002

内置标签

–>更多参考

for标签:遍历数组/字典

<ul>
    {% for blog in blog_list %}
        <li> {{ blog.name }} - {{ blog.tagline }} - {{ blog.logo }} </li>
    {% endfor %}
</ul>
{% for key, value in data.items %}
    {{ key }}: {{ value }}
{% endfor %}

当传递到 for 标签中的数组不存在或为空时,可以使用 {% empty %} 标签来指定输出的内容:

<ul>
    {% for blog in blog_list %}
        <li> {{ blog.name }} - {{ blog.tagline }} - {{ blog.logo }} </li>
    {% empty %}
        <li>Sorry, no blog in this list.</li>
    {% endfor %}
</ul>

if…elif…else:判断一个变量的布尔值

如果判断结果是“true”,则显示块的内容

{% if blog_list|length > 4 %}
    博客列表条目大于4
{% elif blog_list|length > 0 %}
    博客列表不大于4
{% else %}
    博客列表为空
{% endif %}

url:返回与给定视图和可选参数相匹配的绝对路径引用

<ul>
    {% for blog in blog_list %}
        <li> {{ blog.name }} - {{ blog.tagline }} - {{ blog.logo }} -
            <a href="{% url 'blog_detail' blog.id %}">详情</a>
        </li>
    {% endfor %}
</ul>

{% url 'blog_detail' blog.id %} 中的'blog_detail'对应在URLconf中给路由定义的name别名,如下

urlpatterns = [
    # ...
    path('<int:blog_id>', views.blog_detail_view,  {'lang':'EN'},name='blog_detail'),
    # ...
]

static:返回静态文件路径引用

app_demo/templates/app_demo/blog_list.html

{% load static %}
<!-- ... -->
<head>
    <!-- ... -->
	<link rel="stylesheet" href="{% static 'app_demo/style.css' %}">
</head>
<!-- ... -->

app_demo/static/app_demo/style.css

ul{
    list-style-type:circle;
}

image-20220329145913086

extend 和 block:模板继承和重写

Django 的模板引擎中最强大的——也是最复杂的——部分是模板继承。模板继承允许你建立一个基本的“骨架”模板,它包含了你网站的所有常用元素,并定义了子模板可以覆盖的

我们先看一个例子,看看模板继承:

  • 父模板:app_demo/templates/app_demo/base.html
<!DOCTYPE html>
<html lang="en">
<head>
    <title>{% block title %}博客项目{% endblock %}</title>
    {% block css %}
        {# css 导入块 #}
    {% endblock %}
</head>

<body>
<div id="sidebar">
    {% block sidebar %}
        {# 左边-侧边栏块 #}
        <ul>
            <li><a href="/">Home</a></li>
            <li><a href="/blog/">Blog</a></li>
        </ul>
    {% endblock %}
</div>

<div id="content">
    {% block content %}
        {# 右边-主要区域块 #}
    {% endblock %}
</div>

{% block js %}
    {# js 导入块 #}
{% endblock %}
</body>
</html>

这个模板,我们称之为 base.html,它定义了一个 HTML 骨架文档,你可以用它来制作一个两栏式页面。“子”模板的工作是用内容填充空块。

在这个例子中,block 标签定义了多个块,子模板可以填入其中。block 标签所做的就是告诉模板引擎,子模板可以覆盖模板的这些部分。

  • 子模板:

app_demo/templates/app_demo/blog_list.html

{% extends 'app_demo/base.html' %}
{% load static %}

{% block css %}
    <link rel="stylesheet" href="{% static 'app_demo/style.css' %}">
{% endblock %}


{% block content %}
    <h1>blog列表</h1>
    <ul>
        {% for blog in blog_list %}
            <li> {{ blog.name }} - {{ blog.tagline }} - {{ blog.logo }} -
                <a href="{% url 'blog_detail' blog.id %}">详情</a>
            </li>
        {% endfor %}
    </ul>
    <div>博客总数:{{ count }}</div>
{% endblock %}

注意要点:

  • 如果你在模板中使用 {% extends %},它必须是该模板中的第一个模板标签
  • 基础模板中的 {% block %} 标签越多越好。

内置过滤器

–>更多参考

通过Boostrap美化模板

修改布局模板
app_demo/templates/app_demo/bash.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>{% block title %}博客项目{% endblock %}</title>
    <!-- Bootstrap -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"
          integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
    <link href="https://fastly.jsdelivr.net/npm/@bootcss/v3.bootcss.com@1.0.35/examples/dashboard/dashboard.css"
          rel="stylesheet">
    {% block css %}
        {# css 导入块 #}
    {% endblock %}
</head>

<body>
<nav class="navbar navbar-inverse navbar-fixed-top">
    <div class="container-fluid">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar"
                    aria-expanded="false" aria-controls="navbar">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="#">酷酷博客</a>
        </div>
        <div id="navbar" class="navbar-collapse collapse">
            <ul class="nav navbar-nav navbar-right">
                <li><a href="#">Dashboard</a></li>
                <li><a href="#">Settings</a></li>
                <li><a href="#">Profile</a></li>
                <li><a href="#">Help</a></li>
            </ul>
            <form class="navbar-form navbar-right">
                <input type="text" class="form-control" placeholder="Search...">
            </form>
        </div>
    </div>
</nav>

<div class="container-fluid">
    <div class="row">

        <div class="col-sm-3 col-md-2 sidebar">
            {% block sidebar %}
                {# 左边-侧边栏块 #}
                <ul class="nav nav-sidebar">
                    <li class="active"><a href="#">Overview <span class="sr-only">(current)</span></a></li>
                    <li><a href="/blog/">Blog</a></li>
                </ul>
            {% endblock %}
        </div>


        <div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
            {% block content %}
                {# 右侧-主要内容区域块 #}
            {% endblock %}
        </div>

    </div>
</div>


<!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
<script src="https://fastly.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"
        integrity="sha384-nvAa0+6Qg9clwYCGGPpDQLVpLNn0fRaROjHqs13t4Ggj3Ez50XnGQqc/r8MhnRDZ"
        crossorigin="anonymous"></script>
<!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"
        integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd"
        crossorigin="anonymous"></script>

{% block js %}
    {# js 导入块 #}
{% endblock %}
</body>
</html>

image-20220329154238228


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。
My Show My Code