python 之 Django框架(模板系统、过滤器、simple_tag

系统 1702 0

12.35 Django模板系统

{{ }}和 {% %},变量相关的用{{}},逻辑相关的用{%%}

app02/views:

            
              #
            
            
               模板语言测试函数
            
            
              def
            
            
               template_test(request):
    name 
            
            = 
            
              "
            
            
              张三
            
            
              "
            
            
              
    dic 
            
            = {
            
              "
            
            
              name
            
            
              "
            
            : 
            
              "
            
            
              张三
            
            
              "
            
            , 
            
              "
            
            
              age
            
            
              "
            
            : 16, 
            
              "
            
            
              items
            
            
              "
            
            : 
            
              "
            
            
              sb
            
            
              "
            
            
              }
    list1 
            
            = [11, 22, 33, 44, 55
            
              ]
​
    
            
            
              class
            
            
               Person(object):
        
            
            
              def
            
            
              __init__
            
            
              (self, name):
            self.name 
            
            =
            
               name
​
        
            
            
              def
            
            
               dream(self):
            
            
            
              return
            
            
              "
            
            
              {}在做白日梦
            
            
              "
            
            
              .format(self.name)
    p1 
            
            = Person(
            
              "
            
            
              张三丰
            
            
              "
            
            
              )
    
            
            
              import
            
            
               datetime
    today 
            
            =
            
               datetime.datetime.today()
​
    
            
            
              return
            
            
               render(
        request,
        
            
            
              "
            
            
              template_test.html
            
            
              "
            
            
              ,
        {
            
            
            
              "
            
            
              name
            
            
              "
            
            
              : name,
            
            
            
              "
            
            
              dic
            
            
              "
            
            
              : dic,
            
            
            
              "
            
            
              list
            
            
              "
            
            
              : list1,
            
            
            
              "
            
            
              obj
            
            
              "
            
            
              : p1,
            
            
            
              "
            
            
              box
            
            
              "
            
            : 
            
              "
            
            
              黑盒子
            
            
              "
            
            
              ,
            
            
            
              "
            
            
              filesize
            
            
              "
            
            : 1234567890
            
              ,
            
            
            
              "
            
            
              today
            
            
              "
            
            
              : today,
            
            
            
              "
            
            
              str
            
            
              "
            
            : 
            
              "
            
            
              
            
            
              "
            
            
              ,
            
            
            
              "
            
            
              words
            
            
              "
            
            : 
            
              """
            
            
              
                先帝创业未半而中道崩殂
            
            
            
              """
            
            
              
        }
    )
            
          

template_test.html:

            {
            
              { dic.name 
            
            }
            
              } 
            
            {
            
              { dic.age 
            
            }
            
              }    #张三  16

            
            {
            
              { dic.items 
            
            }
            
              }                #Django的模板语言中属性的优先级大于方法的优先级  sb

            
            {
            
              { obj.name 
            
            }
            
              }                 #张三丰

            
            {
            
              { obj.dream 
            
            }
            
              }                #张三丰在做白日梦   模板语言中调用绑定方法不需要加括号
            
          
12.351 过滤器

在Django的模板语言中,通过使用 过滤器 来改变变量的显示, 过滤器的语法: {{ value|filter_name:参数 }}

使用管道符"|"来应用过滤器

例如:{{ name|lower }}会将name变量应用lower过滤器之后再显示它的值。lower在这里的作用是将文本全都变成小写。

template_test.html:

            
            
            {
            
              { list 
            
            }
            
              }                     #[11, 22, 33, 44, 55]

            
            {
            
              { list.0 
            
            }
            
              }                   #索引取值:11

            
            {
            
              { list|first 
            
            }
            
              }               # 11

            
            {
            
              { list|length 
            
            }
            
              }              #返回值的长度,作用于字符串和列表  5

            
            {
            
              { list|slice
            
            :
            
              "2:-1" 
            
            }
            
              }         #切片:[33,44]

            
            {
            
              { ['a','b']|join
            
            :
            
              "*" 
            
            }
            
              }        #"a*b"

            
            {
            
              { box|default
            
            :
            
              "空盒子" 
            
            }
            
              }      #如果box没有传值或者值为空的话就显示默认值,否则使用变量的值

            
            {
            
              { filesize|filesizeformat 
            
            }
            
              }   #格式化文件大小  1.1G

            
            {
            
              { today|date
            
            :
            
              "Y-m-d H:i:s" 
            
            }
            
              }  #格式化日期格式  

            
            {
            
              { str|safe 
            
            }
            
              }                  #取消转义,直接应用HTML标签

            
            {
            
              { words|truncatechars
            
            :
            
              9 
            
            }
            
              }     #字符串字符多于指定的字符数量会被截断,截断的字符串将以(“...”)结尾

            
            {
            
              { words|truncatewords
            
            :
            
              9
            
            }
            
              }      #在一定数量的字后截断字符串,截断的字符串将以(“...”)结尾

            
            {
            
              { i love you|cut
            
            :
            
              ' ' 
            
            }
            
              }        #移除value所有的与给出的变量相同的字符串,输出'iloveyou'

            
            {
            
              { 1|add
            
            :
            
              1 
            
            }
            
              }                  # 2  #add可以数字加法,拼接字符串,拼接列表

            
            {
            
              { name|upper 
            
            }
            
              }               # NAME
​

            
          

timesince:将日期格式设为自该日期起的时间(例如,“4天,6小时”),blog_date是表示2006年6月1日午夜的日期实例,并且comment_date是2006年6月1日08:00的日期实例,则以下将返回“8小时”:

            {
            
              { blog_date|timesince
            
            :
            
              comment_date 
            
            }
            
              }
            
          
12.352 自定义filter
            
              app02:
    
            
            
              __init__
            
            
              .py
    models.py
    templatetags:         
            
            
              #
            
            
               在app02下面新建一个名为templatetags的(Python package)包
            
            
              __init__
            
            
              .py
        app02_filters.py  
            
            
              #
            
            
               建一个存放自定义filter的文件
            
            
    views.py
          

编写自定义filter:

app02_filters.py :

            
              from
            
             django 
            
              import
            
            
               template
register 
            
            = template.Library()   
            
              #
            
            
               生成一个用于注册自定义filter方法的实例
            
            
              ​
@register.filter(name
            
            =
            
              "
            
            
              sb
            
            
              "
            
            
              )

            
            
              def
            
            
               add_sb(value):
    
            
            
              return
            
            
              "
            
            
              {} sb
            
            
              "
            
            
              .format(value)
​
@register.filter(name
            
            =
            
              "
            
            
              cut
            
            
              "
            
            
              )

            
            
              def
            
            
               cut(value, arg):
    
            
            
              return
            
             value.replace(arg, 
            
              ""
            
            )
          

template_test.html:

            {
            
              % load app02_filters %
            
            }
            
                      # 先导入我们自定义filter那个文件 
​

            
            {
            
              { name 
            
            }
            
              }                      #张三

            
            {
            
              { name|sb 
            
            }
            
              }                   #张三 sb

            
            {
            
              { name|cut
            
            :
            
              "三" 
            
            }
            
              }              #张
            
          

注意:

过滤器支持“链式”操作。即一个过滤器的输出作为另一个过滤器的输入。 过滤器可以接受参数,例如:{{ sss|truncatewords:30 }},这将显示sss的前30个词。 过滤器参数包含空格的话,必须用引号包裹起来。比如使用逗号和空格去连接一个列表中的元素, 如:{{ list|join:', ' }} ':'左右没有空格

12.353 simple_tag

和自定义filter类似,但接收更灵活的参数

定义注册simple_tag:文件名:app01_my_simple_tags

            
              from
            
             django 
            
              import
            
            
               template
register 
            
            = template.Library()   
            
              #
            
            
               生成一个用于注册simple_tag自定义方法的实例
            
            
              ​
@register.simple_tag(name
            
            =
            
              "
            
            
              plus
            
            
              "
            
            
              )

            
            
              def
            
            
               plus(a, b, c):
    
            
            
              return
            
            
              "
            
            
              {} + {} + {}
            
            
              "
            
            .format(a, b, c)
          

使用自定义simple_tag:

            {
            
              % load app01_my_simple_tags %
            
            }
            
            {
            
              % plus "1" "2" "abc" %
            
            }
            
                  #"12abc"
            
          
12.354 inclusion_tag

多用于返回html代码片段

templatetags /inclusion_tag_test.py :

            
              from
            
             django 
            
              import
            
            
               template
register 
            
            =
            
               template.Library()
​
@register.inclusion_tag(
            
            
              '
            
            
              result.html
            
            
              '
            
            
              )

            
            
              def
            
            
               show_results(n):
    n 
            
            = 1 
            
              if
            
             n < 1 
            
              else
            
            
               int(n)
    data 
            
            = [ 
            
              for
            
             i 
            
              in
            
             range(1, n+1
            
              )]
    
            
            
              return
            
             {
            
              "
            
            
              data
            
            
              "
            
            : data}           
            
              #
            
            
              用字典给result.html传值
            
          

templates/ result.html :

            
              
{ % for i in data % }
  • { { i } } { % endfor % }
  • templates/index.html:

                
                
                
                  <
                
                
                  html 
                
                
                  lang
                
                
                  ="en"
                
                
                  >
                
                
                  <
                
                
                  head
                
                
                  >
                
                
                  <
                
                
                  meta 
                
                
                  charset
                
                
                  ="UTF-8"
                
                
                  >
                
                
                  <
                
                
                  meta 
                
                
                  name
                
                
                  ="viewport"
                
                
                   content
                
                
                  ="width=device-width, initial-scale=1"
                
                
                  >
                
                
                  <
                
                
                  title
                
                
                  >
                
                inclusion_tag test
                
                  
                    title
                  
                  
                    >
                  
                  
                    
                      head
                    
                    
                      >
                    
                    
                      <
                    
                    
                      body
                    
                    
                      >
                    
                    
                      
    {% load inclusion_tag_test %}   #导入 inclusion_tag文件
    {% show_results 10 %}
    
                    
                    
                      
                        body
                      
                      
                        >
                      
                      
                        
                          html
                        
                        
                          >
                        
                      
                    
                  
                
              
    12.355 Tags

    for循环:

                
                  
    { % for user in user_list % }
  • { { forloop.counter } } #当前循环的索引值(从1开始)
  • { { forloop.counter0 } } #当前循环的索引值(从0开始)
  • { { forloop.revcounter } } #当前循环的倒序索引值(从1开始)
  • { { forloop.revcounter0 } } #当前循环的倒序索引值(从0开始) # { % if forloop.first % } #当前循环是不是第一次循环(布尔值) { % if forloop.last % } #当前循环是不是最后一次循环(布尔值)
  • { { user.name } } { % else % }
  • xxxxx
  • <% endif %>
    { % empty % } #if语句都没执行时执行empty xxxxx { % endfor % }

    with: 定义一个中间变量,多用于给一个复杂的变量起别名

                {
                
                  % with total=business.employees.count %
                
                }
                
                         #注意等号左右不要加空格。
        
                
                {
                
                  { total 
                
                }
                
                  } employee
                
                {
                
                  { total|pluralize 
                
                }
                
                  }
    
                
                {
                
                  % endwith %
                
                }
                
                {
                
                  % with business.employees.count as total %
                
                }
        {
                
                  { total 
                
                }
                
                  } employee
                
                {
                
                  { total|pluralize 
                
                }
                
                  }
    
                
                {
                
                  % endwith %
                
                }
              

    for ... empty:

                
                  
    { % for user in user_list % }
  • { { user.name } } { % empty % }
  • 空空如也
  • { % endfor % }
    12.356 母版

    新建一个HTML文件(base.html),将公用的标签放在base.html中作为母版,其他子页面可以继承此母版,避免代码的重复和多次修改

    base.html:

                
                
                
                  <
                
                
                  html 
                
                
                  lang
                
                
                  ="en"
                
                
                  >
                
                
                  <
                
                
                  head
                
                
                  >
                
                
                  <
                
                
                  meta 
                
                
                  charset
                
                
                  ="UTF-8"
                
                
                  >
                
                
                  <
                
                
                  meta 
                
                
                  http-equiv
                
                
                  ="x-ua-compatible"
                
                
                   content
                
                
                  ="IE=edge"
                
                
                  >
                
                
                  <
                
                
                  meta 
                
                
                  name
                
                
                  ="viewport"
                
                
                   content
                
                
                  ="width=device-width, initial-scale=1"
                
                
                  >
                
                
                  <
                
                
                  title
                
                
                  >
                
                Title
                
                  
                    title
                  
                  
                    >
                  
                  
                    
      {% block page-css %}
      
      {% endblock %}
    
                  
                  
                    
                      head
                    
                    
                      >
                    
                    
                      <
                    
                    
                      body
                    
                    
                      >
                    
                    
                      
    {#导航条 开始#}
    {% include 'nav.html' %}
    {#导航条 结束#}
    
                    
                    
                      <
                    
                    
                      h1
                    
                    
                      >
                    
                    这是母板的标题
                    
                      
                        h1
                      
                      
                        >
                      
                      
                        
    {% block page-content %}
    ​
    {% endblock %}
    
                      
                      
                        <
                      
                      
                        h1
                      
                      
                        >
                      
                      母板底部内容
                      
                        
                          h1
                        
                        
                          >
                        
                        
                          
    {% block page-js %}
    ​
    {% endblock %}
    
                        
                        
                          
                            body
                          
                          
                            >
                          
                          
                            
                              html
                            
                            
                              >
                            
                          
                        
                      
                    
                  
                
              

    注意:我们通常会在母板中定义页面专用的CSS块和JS块,方便子页面替换。

    继承母板:

    在子页面中在页面最上方使用下面的语法来继承母板:

                {
                
                  % extends 'base.html' %
                
                }
    {
                
                  % block page-content %
                
                }
                
                  
    .....
    
                
                {
                
                  % endblock %
                
                }
              

    组件:

    可以将常用的页面内容如导航条,页尾信息等组件保存在单独的文件中,然后在需要使用的地方按如下语法导入即可:

    nav.html: 导航条

                
                  
                
              

    xxx.html:

                
                
                
                  <
                
                
                  html 
                
                
                  lang
                
                
                  ="en"
                
                
                  >
                
                
                  <
                
                
                  head
                
                
                  >
                
                
                  <
                
                
                  meta 
                
                
                  charset
                
                
                  ="UTF-8"
                
                
                  >
                
                
                  <
                
                
                  title
                
                
                  >
                
                Title
                
                  
                    title
                  
                  
                    >
                  
                  
                    
                      head
                    
                    
                      >
                    
                    
                      <
                    
                    
                      body
                    
                    
                      >
                    
                    
                      
    ​
    {% include 'nav.html' %}                #在使用时通过{% include 组件文件 %}来引入公用组件
    
                    
                    
                      <
                    
                    
                      div 
                    
                    
                      class
                    
                    
                      ="container"
                    
                    
                      >
                    
                    
                      <
                    
                    
                      div 
                    
                    
                      class
                    
                    
                      ="row"
                    
                    
                      >
                    
                    
                      <
                    
                    
                      div 
                    
                    
                      class
                    
                    
                      ="page-header "
                    
                    
                      >
                    
                    
                      <
                    
                    
                      h1 
                    
                    
                      class
                    
                    
                      ="text-center"
                    
                    
                      >
                    
                    新增作者信息
                    
                      
                        h1
                      
                      
                        >
                      
                      
                        <
                      
                      
                        div 
                      
                      
                        class
                      
                      
                        ="col-md-6 col-md-offset-3"
                      
                      
                        >
                      
                      
                        
                .......
                
                      
                      
                        
                          div
                        
                        
                          >
                        
                        
                          
                            div
                          
                          
                            >
                          
                          
                            
                              div
                            
                            
                              >
                            
                            
                              
                                div
                              
                              
                                >
                              
                              
                                
                                  body
                                
                                
                                  >
                                
                                
                                  
                                    html
                                  
                                  
                                    >
                                  
                                
                              
                            
                          
                        
                      
                    
                  
                
              

    更多文章、技术交流、商务合作、联系博主

    微信扫码或搜索:z360901061

    微信扫一扫加我为好友

    QQ号联系: 360901061

    您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

    【本文对您有帮助就好】

    您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

    发表我的评论
    最新评论 总共0条评论