zoukankan      html  css  js  c++  java
  • Django 第三课 【模板】

    ## 模板

    在之前的章节中 ,视图函数只返回文本,而实际上生产环境中其实很少这样用,因为实际的页面大多数是带有样式的HTML代码,这可以让浏览器渲染出非常漂亮的页面。目前市面上有非常多的模板系统。其中最知名最好用的就是DTL 和Jinja2。DTL 是Django Temlate Language 三个单词的缩写。也就是Django自带的模板语言。当然也可以配置Django支持Jinja2等其他模板引擎,但是作为Django内置的模板语言,和Django可以达到无缝衔接而不会产生一些不兼容的情况。因此建议使用DTL

    ## DTL 与 普通的HTML文件的区别

    DTL模板是一种带有特殊语法的HTML文件,这个HTML文件可以被Django编译,可以传递参数进去,实现数据动态化。在编译完成后,生产一个普通的HTML文件,然后发给客户端

    ##渲染模板

    渲染模板有多种方式,这里讲下俩种常用方式:

    1:render_to_string  : 找到模板,然后将模板编译后渲染成python的字符串格式。最后再通过HttpResponse类包装成一个HttpResponse对象返回,示例代码如下:

    form django.template.loader import render_to_string
    form django.http import HttpResponse
    
    def book_detail(request,book_id)
          html = render_to_string("detail_html")
          return HttpResponse(html)

    以上的方式虽然已经很方便了,但是django还提供了一个更加简便的方式,直接将模板渲染成字符串和包装成HttpRersponse对象一步到位完成,示例代码如下:

    form django.shortcuts import render
    def book_list(request):
          return render(request,'list.html')

    ## 模板查找路径配置

    在项目的setting.py 文件中, 有个 TEMPLATES 配置,这个配置包含了模板引擎的配置,模板查找路径的配置,模板上下文的配置等等。模板路径可以在俩个地方配置

    1:DIRS :这是一个列表,在这个列表中存放所有的模板路径,以后在视图中使用render或者 render_to_string 渲染模板的时候,会在这个列表的路径中查找模板

    'DIRS': [os.path.join(BASE_DIR, 'templates')], # templates相对路径
    os.path.join #拼接字符串路径函数
    # Build paths inside the project like this: os.path.join(BASE_DIR, ...) 相对路径
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

    2:APP_DIRS:默认为True ,这个配置为True之后,会在 INSTALLED_APPS 的安装了的APP下的 templates 文件夹中查找模板。

    3:查找循序:比如代码 render(request,'list.html') ,先会在 DIRS 这个列表中依次查找路径下有没这个模板,如果有,就返回。如果 DIRS 列表中所有的路径都没有找到。那么会先去检查当前这个视图所处的App是否安装,如果已经安装了,那么就先在当前安装的app下的 templates文件夹中查找模板,如果没有找到,那么会在其他已经安装的app中查找,如果所有的路径下都有没有找到,那么就会抛出templatesDoesNotExist异常

    ## 模板变量

    1:在模板中使用变量,需要将变量放到‘{{ 变量 }}’ 中

    2:如果想要访问变量的属性,那么可以通过 ‘对象.属性名’ 来进行访问

    class Person(object):
            def __init__(self, username):
                 self.username = username
    
    context = {
         person:p
    }

    以后想要访问 ’person‘ 的 ’username‘ ,那么可以通过 ’person.username‘ 来访问

    3:如果想要访问一个字典的key对应的value,那么只能通过 ‘字典.key’的方式进行访问, 不能通过 ‘中括号[]’的形式进行访问

    context = {
         person:{
          'username' = 'nelsen'
        }
    }

    那么以后访问模板中的’username‘,就可以使用 ’person.username‘

    4:因为在访问字典的 ‘key’ 时候也是使用 ‘点 . ’来访问,因此不能再字典中定义字典本身就有的属性名当做 ’key‘ , 否则字典的那个属性将变成字典中的key了

    context = {
         person:{
          'username' = 'nelsen'
          'keys' = 'abs'
        }
    }

    以上的做法是错误的,字典的关键字,不能当做key值

    5:如果想要访问列表或者元组,那么也是通过 ’点 . ‘的方式进行访问,不能通过 ’中括号[] ‘的形式进行访问,这一点和python中是不一样的,示例代码下:

    {{ person.0}} , {{ person.1}} 等

    ## 常用的模板标签

    快捷键:Tab --》 自动补齐  

                common + /  --》注销代码

                common + D  --》复制上一句代码到下面去

    # if 语句标签

    1:所有的标签都是在 ’{%%}‘之间。

    2:if标签有闭合标签,就是 ’{%endif%}‘

    3:if标签的判断运算符,就是跟python中的判断符是一样的,’ == , != ,  <  ,  > ,  <=  , in , not in , is , is not  ‘这些都可以使用

    4:还可以使用 ’elif‘ 以及 ’else‘ 等标签。

    # for...in...标签

    1:可以遍历列表,元组,字符串,字典等一切可以遍历的对象,示例代码:

    <table>
    <thead>
    <tr>
    <td>序号</td>
    <td>书名</td>
    <td>作者</td>
    <td>价格</td>
    </tr>
    </thead>
    <tbody>
    {% for book in books %}
    {% if forloop.first %}
    <tr style="background:red;">
    {% elif forloop.last %}
    <tr style="background:pink;">
    {% else %}
    <tr>
    {% endif %}
    <td>{{ forloop.counter }}</td>
    <td>{{ book.name }}</td>
    <td>{{ book.author }}</td>
    <td>{{ book.price }}</td>
    </tr>
    {% endfor %}

    </tbody>
    </table>

    如果想要反向遍历,那么在遍历的时候就加上一个 ’reversed‘。示例代码如下:

     {% for book in books reversed %}
               
                <p>{{ forloop.counter }}</p>
             
            {% endfor %}

    在for循环中,‘DTL’提供了一些变量可供使用。这些变量如下:

    * ‘forloop.cointer’:当前循环的下标。以1作为起始值。

    * ‘forloop.cointer0’:当前循环的下标。以0作为起始值。

    * ‘forloop.revcounter’:当前循环的反向下标值。比如列表有5个元素,那么遍历就从 5,4,3,2,1

    * ‘forloop.revcounter0’:当前循环的反向下标值。比如列表有5个元素,那么遍历就从 4,3,2,1,0

    * ‘forloop.first’:是否是第一次遍历。

    * ‘forloop.last’:是否是最后一次遍历。

    * ‘forloop.parentloop’:如果有多个循环嵌套,那么这个属性代表的是上一级的for循环。

    ** 模板中的 ‘for.. in...’ 没有continue和break语句,这一点和python中有很大的不同,一点要记清楚

    ## ‘for..in...empty..’标签:

    这个标签使用跟 ‘for...in...’是一样的,只不过实在遍历的对象如果没有元素的情况下,会执行empty中的内容。示例代码如下:

     {% for book in books reversed %}
               
           <li>{{ forloop.counter }}</li>
    
     {% empty %}
    
           <li>{{ 暂时还没有任何数据 }}</li>
             
      {% endfor %}

    ## url标签

  • 相关阅读:
    [原创.数据可视化系列之六]使用openlyaers进行公网地图剪切
    [原创.数据可视化系列之五]韩国"萨德"系统防御图
    [原创.数据可视化系列之四]跨平台,多格式的等值线和等值面的生成
    [原创.数据可视化系列之三]使用Ol3加载大量点数据
    [原创.数据可视化系列之二]使用cesium三维地图展示美国全球军事基地分布
    [原创.数据可视化系列之一]使用openlayers 3 显示聚合数据
    全球领先的redis客户端:SFedis
    ESSENTIALS OF PROGRAMMING LANGUAGES (THIRD EDITION) :编程语言的本质 —— (一)
    请大家帮我找一找bug —— 一个MySQL解析程序(JAVA实现)
    半个月使用rust语言的体验
  • 原文地址:https://www.cnblogs.com/nelsen-chen/p/9441769.html
Copyright © 2011-2022 走看看