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

模板标签

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

准备

标签语法

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

常用标签

案例

  • index.html文件中的demo








    {# 如果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开始#}
    {# 硬编码跳转 #}

    {# forloop.counter0获取当前for循环的迭代次数,以0开始#}
    {# #}
    {# forloop.revcounter获取当前for循环的迭代次数,从大到小#}
    {# #}
    {# forloop.revcounter0获取当前for循环的迭代次数,从大到小,最小为0#}
    {# #}




    {# 如果students为空,则渲染empty下的内容#}
    {# {% empty %}#}
    {# 要渲染的内容#}
    {% endfor %}
    序号 姓名 年龄 性别
    {{ forloop.counter }} {{ forloop.counter }}{{ forloop.counter0 }}{{ forloop.revcounter }}{{ forloop.counter0 }} {{ stu.name }} {{ stu.age }} {{ stu.gender }}

  • 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
    ]

  • 效果图:
    ![在这里插入图片描述]( https://img-blog.csdnimg.cn/20190221000324621.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9nZWxkeA==,size_16,color_FFFFFF,t_70)

模板的继承与引用

引用

  • 将渲染好的模板放到想要放的模板中

  • 用include标签将ad.html引用到index.html中

  • index.html中加入下面代码:


    {% include 'students/ad.html' %}

  • ad.html文件中代码:

    你看不见我,你看不见我


继承

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

        我是base

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

不加block案例

![在这里插入图片描述]( https://img-blog.csdnimg.cn/20190221012058731.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9nZWxkeA,size_16,color_FFFFFF,t_70)
![在这里插入图片描述]( https://img-blog.csdnimg.cn/20190221012136627.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9nZWxkeA
,size_16,color_FFFFFF,t_70)

案例

  • base.html文件demo:

    {% load static %}








    {% block title %}base{% endblock %}



    {% block link %}{% endblock %}


    {% block content %}
    {% endblock %}
    {% block domready %}
    {% endblock %}

  • index.html文件的demo:

    {% extends 'students/base.html' %}
    {% block title %}学生表{% endblock %}
    {% load static %}
    {% block link %}{% endblock %}
    {% block content %}




    {# 从这里开始替换#}







    {# 如果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开始#}
    {# 硬编码跳转 #}

    {# forloop.counter0获取当前for循环的迭代次数,以0开始#}
    {# #}
    {# forloop.revcounter获取当前for循环的迭代次数,从大到小#}
    {# #}
    {# forloop.revcounter0获取当前for循环的迭代次数,从大到小,最小为0#}
    {# #}




    {# 如果students为空,则渲染empty下的内容#}
    {# {% empty %}#}
    {# 要渲染的内容#}
    {% endfor %}
    序号 姓名 年龄 性别
    {{ forloop.counter }} {{ forloop.counter }}{{ forloop.counter0 }}{{ forloop.revcounter }}{{ forloop.counter0 }} {{ stu.name }} {{ stu.age }} {{ stu.gender }}




    {# 将渲染好的模板放到想要放的模板#}
    {% include 'students/ad.html' %}

    {% endblock %}
    {% block domready %}


  • 效果图:
    ![在这里插入图片描述]( https://img-blog.csdnimg.cn/20190221020651512.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9nZWxkeA==,size_16,color_FFFFFF,t_70)
    base模块用尽可能多的block,根据实际业务,宁多勿缺

posted on 2019-02-21 02:25  小哥东  阅读(207)  评论(0)    收藏  举报