美文网首页
Django框架(四):模版标签及模版的继承与引用

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

作者: 加州旅馆_6741 | 来源:发表于2019-05-02 22:12 被阅读0次

一.模版标签

当我们要用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 灵活使用就能做到灵活的插入广告

相关文章

网友评论

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

      本文链接:https://www.haomeiwen.com/subject/plvmvqtx.html