Django框架(四):模版标签及模版的继承与引用

一.模版标签

当我们要用Python语句去调用模版变量时就要用到模版标签

当我们在视图函数里面定义一个字典,在模版文件里面用普通的方法引用时会用如下方法

#teacher/view.py

def index(requese):
  students = [
    {'name':'张三','sex':'男','age':'33'},
    {'name':'李四','sex':'男','age':'22'},
    {'name':'王五','sex':'男','age':'25'},
  ]
return render(request,'teacher/index.html',context='{'student':students}')
#templater/teacher/index.html
<table>
  <thead>
  <tr>
  <th>姓名</th><th>性别</th><th>年龄</th>
  </tr>
  </thead>
  <tbody>
  <tr>
  <td>{{students.0.name}}</td>
  <td>{{students.0.sex}}</td>
  <td>{{students.0.age}}</td>
  </tr>
  <tr>
  <td>{{students.1.name}}</td>
  <td>{{students.1.sex}}</td>
  <td>{{students.1.age}}</td>
  </tr>
  <tr>
  <td>{{students.2.name}}</td>
  <td>{{students.2.sex}}</td>
  <td>{{students.2.age}}</td>
  </tr>
  </tbody>
</table>

这样的引用属于硬编码,非常不实用,所以要用到模版标签,可以将上面的代码作如下修改

#templater/teacher/index.html
<table>
  <thead>
  <tr>
  <th>姓名</th><th>性别</th><th>年龄</th>
  </tr>
  </thead>
  <tbody>
  {% for student in students%}
  <tr>
  <td>{{student.name}}</td>
  <td>{{student.sex}}</td>
  <td>{{student.age}}</td>
  </tr>
  {% endif %}
  </tbody>
</table>

上面和下面的index.html结果是一样的

常用标签

(1)if/elif/else:可以使用and/or/in/not/==/!=/<=/>=,来进行判断。ifequal/ifnotequal
(2)for…in…:跟python中的for…in…是一样的用法。
forloop.counter:当前迭代的次数,下标从1开始。
forloop.counter0:当前迭代的次数,下标从0开始。
forloop.revcounter:跟forloop.counter一样,下标从大到小。
forloop.revcounter0:跟forloop.counter0一样,下标从大到小。
forloop.first:返回bool类型,如果是第一次迭代,返回true,否则返回false。
forloop.last:返回bool类型,如果是最后一次迭代,返回True,否则返回False。
forloop.parentloop:如果发生多层for循环嵌套,那么这个变量返回的是上一层的for
(3)for…in…empty…:如果没有数据,跳转到empty中。
(4)load:加载第三方标签。最常用的是{%load static%}
(5)url:返回一个命名了的URL的绝对路径。
(6)with:缓存一个变量。
(7)autoescape:开启和关闭自动转义。

URL反向解析

通常当我们点开一个详情页面的时候,会跳转到另一个URL,这时候会用到模板标签里面的URL反向解析

使用方法:

  1. 先定义好视图函数
def student_detail_view(request,pk):
    students = {
        1:{'name':'李萌','sex':'302','age':'16','hobby':['看书','看电影','骑车']},
        2:{'name':'张杨','sex':'301','age':'80','hobby':['看书','看电影','骑车']},
        3:{'name':'鸣人','sex':'301','age':'18','hobby':['看书','看电影','骑车']}
    }
    if pk in students:
        student = students[pk]
    else:
        student = "没有此人"
    return render(request,'teacher/student_detail.html',context={'student':student})
  1. 简单编辑一个详情页模板
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>学生详情页</title>
</head>
<body>
学生详情:{{ student }}
</body>
</html>
  1. 定义好 URL 路由
from django.urls import path,re_path
from . import views


app_name = 'teacher'

urlpatterns = [
    path('students/',views.students_view),
    path('studentDetail/<int:pk>',views.student_detail_view,name='studentDetail')
]
  1. 在模板文件中加入a标签,用URL模板标签定义a标签的路由
            {% for student in students %}
                <tr {% if student.sex == '女' %} style="background-color: darksalmon"
                {% else %} style="background-color:aquamarine"
                {% endif %}>
                    <td><a href="{% url 'teacher:studentDetail' student.id %}">{{student.id}}</a></td>
                    <td>{{student.name}}</td>
                    <td>{{student.sex|convert_male}}</td>
                    <td>{{student.age}}</td>
                    <td>
                        {% show_list student.hobby %}
                    </td>
                </tr>

二.模板的继承与引用

1.模板继承

每个不同的页面基本上都有相同的公共的部分,我们可以把这些公共的部分单独拿出来当作基本模板(base),然后在不同的模板中继承这个基本模板

a. 先创建一个base模板

<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
    <title>{% block title %}这是首页{% endblock %}</title>

    <!-- Bootstrap -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" rel="stylesheet">

    <!-- HTML5 shim 和 Respond.js 是为了让 IE8 支持 HTML5 元素和媒体查询(media queries)功能 -->
    <!-- 警告:通过 file:// 协议(就是直接将 html 页面拖拽到浏览器中)访问页面时 Respond.js 不起作用 -->
    <!--[if lt IE 9]>
      <script src="https://cdn.jsdelivr.net/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script>
      <script src="https://cdn.jsdelivr.net/npm/respond.js@1.4.2/dest/respond.min.js"></script>
    <![endif]-->
  </head>
  <body>
    {% block content %}

    {% endblock %}
        </tbody>
    </table>
    <!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
    <script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"></script>
    <!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"></script>
  </body>
</html>

上面用到了 block标签, {% block name %} 与 {% endblock %} 之间就是继承基本模板的页面可以根据不同情况改写的内容块
b.继承基本模板

{% extends 'teacher/base.html' %}

只要在模板头部添加一个extends标签,就能继承base.html所有的公共部分,然后在 {% block name %} 与 {% endblock %}中添加自己想要的内容

2.模板引用

当我们需要在一个模板中引入另外一个模板时,比如插入一段广告,我们就会用到模板的引用

模板的引入比较简单,只需要用到include模板标签

    {% block ad %}
        <div style="position: fixed;bottom: 0px">
        {% include 'teacher/ad.html' %}
        </div>
    {% endblock %}

includeblock 灵活使用就能做到灵活的插入广告

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容

  • MTV模型 Django的MTV分别代表: Model(模型):负责业务对象与数据库的对象(ORM) Templa...
    lkning阅读 806评论 0 0
  • 一、Django框架前言知识: 1、C/S和B/S的区别: C/S结构软件:客户端/服务端软件,即客户端要自己下载...
    月下独酌123阅读 4,520评论 0 36
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,472评论 1 45
  • 介绍 Jinja是基于python的模板引擎,功能比较类似于于PHP的smarty,J2ee的Freemarker...
    ZhouLang阅读 7,895评论 0 2
  • 一、概要 对于模版,其实就是读取模版(其中嵌套着模版标签),然后将模型中获取的数据插入到模版中,最后将信息返回给用...
    唯老阅读 1,479评论 0 6