django模板标签

本文转载自https://blog.csdn.net/xiaogeldx/article/details/87840997

模板标签

  • 模板标签:标签在渲染的过程中提供任意的逻辑
  • 这个定义是刻意模糊的,例如:一个标签可以输出内容,作为控制结构,如if语句或for循环从数据库中提取内容,甚至可以访问其他的模板标签

    准备

  • 在http://www.bootcss.com/上找个模板,查看源代码,复制,粘贴到index.html
  • F12查看,复制cover.css(模板.css)中的代码,粘贴到static/students/css/index.css中
  • 将复制到index.html文件中的代码的body内容删除替换自己的代码
    在这里插入图片描述
    在这里插入图片描述
    效果图:
    在这里插入图片描述

    标签语法

  • 由{% 和 %}来定义的,例如:{% tag %} {% endtag %}

    常用标签

  • 标签内的语法和Python语法大致一样
    在这里插入图片描述

    案例

  • index.html文件中的demo

      <table class="table">
          <tr>
              <th>序号</th>
              <th>姓名</th>
              <th>年龄</th>
              <th>性别</th>
          </tr>
      {#  如果students为空,则渲染empty下的内容#}
          {% for stu in students %}   
              <tr {% if stu.age < 17 %}style="color:blue;"
                  {% elif stu.age > 16 and stu.age < 22 %}style="color:red;"
                  {% else %}style="color:green;"
                  {% endif %}>
      {#        forloop.counter获取当前for循环的迭代次数,以1开始#}
      {# 硬编码跳转  <td><a href="/students/detail/{{ stu.id }}/">{{ forloop.counter }}</a></td>#}
                  <td><a href="{% url 'students:detail' stu.id %}">{{ forloop.counter }}</a></td>
      {#        forloop.counter0获取当前for循环的迭代次数,以0开始#}
      {#            <td>{{ forloop.counter0 }}</td>#}
      {#        forloop.revcounter获取当前for循环的迭代次数,从大到小#}
      {#            <td>{{ forloop.revcounter }}</td>#}
      {#        forloop.revcounter0获取当前for循环的迭代次数,从大到小,最小为0#}
      {#            <td>{{ forloop.counter0 }}</td>#}
                  <td>{{ stu.name }}</td>
                  <td>{{ stu.age }}</td>
                  <td>{{ stu.gender }}</td>
              </tr>
      {#  如果students为空,则渲染empty下的内容#}
      {#          {% empty %}#}
      {#          要渲染的内容#}
          {% endfor %}
      </table>
  • views.py文件中的demo:

      def index(request):
          students = [
          {'id':10, 'name': '小哥', 'age': 15, 'gender': '男'},
          {'id':33,'name': 'yang', 'age': 15, 'gender': '女'},
          {'id':53,'name': 'wen', 'age': 25, 'gender': '女'},
          {'id':12,'name': 'long', 'age': 18, 'gender': '男'},
          {'id':76,'name': 'na', 'age': 16, 'gender': '女'},
          {'id':38,'name': 'yi', 'age': 19, 'gender': '女'},
          {'id':48,'name': 'xin', 'age': 17, 'gender': '男'},
          ]
          return render(request, 'students/index.html', context={
              'students': students,
          })
      def detail(request, pk): #pk一般是个id,是整数primary key
          return HttpResponse('学生id为%s的详情页' % pk)
  • urls.py文件中的demo:

          urlpatterns = [
              path('index/', views.index, name='index'),  #index前不要加/,django自动添加,index后面要加/
              path('login/', views.login),
              path('detail/<int:pk>/', views.detail, name='detail'), #捕获的值传递给views.py里的detail(request,pk)的pk
          ]
  • 效果图:
    在这里插入图片描述

    模板的继承与引用

    引用

  • 将渲染好的模板放到想要放的模板中
  • 用include标签将ad.html引用到index.html中
  • index.html中加入下面代码:

      <div style="position:fixed; bottom:0px;">
          {% include 'students/ad.html' %}
      </div>
  • ad.html文件中代码:

      <h1 id="h1">你看不见我,你看不见我</h1>
          <script>
              var h = document.getElementById('h1')
              var color = 'blue'
              function change_color() {
                  if(color=='blue'){
                      color = 'red';
                  }else{
                      color = 'blue';
                  }
                  h.style.color = color;
                  setTimeout('change_color()',400)
              }
              change_color()
          </script>

    继承

  • django模板引擎中最强大也是最复杂的部分就是模板继承了
  • 模板集成可以让你创建一个基本的“骨架”模板,它包含你站点中的全部元素,并且可以定义能够被子模板覆盖的blocks
  • 模板继承使用extends标签实现,通过使用block来给子模板开放接口
    • extends必须是模板中的第一个出现的标签
    • 子模板中的所有内容,必须出现在父模板定义好的block中,否则django将不会渲染
    • 如果出现重复代码,就应该考虑使用模板
    • 尽可能多的定义block,方便子模板实现更细的需求
    • 如果在某个block中,要使用父模板的内容,使用block.super获取
    • block相当于字符串中的占位符,当继承时就可以在block中间写继承模板自己的demo
      • block用法:形如{% block content %}

        我是base

        {% endblock %},
        content起定位作用
    • block可以插入多个

      不加block案例

      在这里插入图片描述
      在这里插入图片描述
  • 效果图:
    在这里插入图片描述

    案例

  • base.html文件demo:

      {% load static %}
      <!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">
          <meta name="description" content="">
          <meta name="author" content="">
          <title>{% block title %}base{% endblock %}</title>
          <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
            <script src="https://cdn.bootcss.com/html5shiv/3.7.3/html5shiv.min.js"></script>
            <script src="https://cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
              {% block link %}{% endblock %}
        </head>
        <body>
        {% block content %}
        {% endblock %}
      {% block domready %}
      {% endblock %}
        </body>
      </html>
  • index.html文件的demo:

      {% extends 'students/base.html' %}
      {% block title %}学生表{% endblock %}
      {% load static %}
      {% block link %}<link href="{% static 'students/css/index.css' %}" rel="stylesheet">{% endblock %}
      {% block content %}
          <div class="blog-masthead">
            <div class="container">
              <nav class="blog-nav">
                <a class="blog-nav-item active" href="#">Home</a>
                <a class="blog-nav-item" href="#">New features</a>
                <a class="blog-nav-item" href="#">Press</a>
                <a class="blog-nav-item" href="#">New hires</a>
                <a class="blog-nav-item" href="#">About</a>
              </nav>
            </div>
          </div>
          <div class="container">
            <div class="blog-header">
              {#  从这里开始替换#}
              <table class="table">
                  <tr>
                      <th>序号</th>
                      <th>姓名</th>
                      <th>年龄</th>
                      <th>性别</th>
                  </tr>
              {#  如果students为空,则渲染empty下的内容#}
                  {% for stu in students %}
                      <tr {% if stu.age < 17 %}style="color:blue;"
                          {% elif stu.age > 16 and stu.age < 22 %}style="color:red;"
                          {% else %}style="color:green;"
                          {% endif %}>
              {#        forloop.counter获取当前for循环的迭代次数,以1开始#}
              {# 硬编码跳转  <td><a href="/students/detail/{{ stu.id }}/">{{ forloop.counter }}</a></td>#}
                          <td><a href="{% url 'students:detail' stu.id %}">{{ forloop.counter }}</a></td>
              {#        forloop.counter0获取当前for循环的迭代次数,以0开始#}
              {#            <td>{{ forloop.counter0 }}</td>#}
              {#        forloop.revcounter获取当前for循环的迭代次数,从大到小#}
              {#            <td>{{ forloop.revcounter }}</td>#}
              {#        forloop.revcounter0获取当前for循环的迭代次数,从大到小,最小为0#}
              {#            <td>{{ forloop.counter0 }}</td>#}
                          <td>{{ stu.name }}</td>
                          <td>{{ stu.age }}</td>
                          <td>{{ stu.gender }}</td>
                      </tr>
              {#  如果students为空,则渲染empty下的内容#}
              {#          {% empty %}#}
              {#          要渲染的内容#}
                  {% endfor %}
              </table>
            </div>
          </div><!-- /.blog-sidebar -->
          <div style="position:fixed; bottom:0px;">
          {#  将渲染好的模板放到想要放的模板#}
              {% include 'students/ad.html' %}
          </div>
      {% endblock %}
      {% block domready %}
          <script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
          <script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script>
          <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
      {% endblock %}
  • 效果图:
    在这里插入图片描述
    base模块用尽可能多的block,根据实际业务,宁多勿缺

猜你喜欢

转载自www.cnblogs.com/xiaogeldx/p/10410188.html