• 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,根据实际业务,宁多勿缺

  • 相关阅读:
    html5图片异步上传/ 表单提交相关
    node 常用命令
    windows下 nvm下载node被墙了解决办法
    36.迷宫(广度优先搜索)
    36.迷宫(广度优先搜索)
    35.大质数
    35.大质数
    35.大质数
    35.大质数
    35.大质数
  • 原文地址:https://www.cnblogs.com/xiaogeldx/p/10410188.html
Copyright © 2020-2023  润新知