zoukankan      html  css  js  c++  java
  • Django之模板层

    前面学习了Django的下载和基础的操作,掌握了其基本框架,接下来我们来学习Django中的模板语法。

    学习任务:知道什么是模板,以及html+模板语法的具体用法

    python的模板:HTML代码+模板语法

    模版包括在使用时会被值替换掉的 变量,和控制模版逻辑的标签。

    #原始的视图
    def timeHandle(request):
    
        import datetime
    
        t=datetime.datetime.now()
    
    #Django修改后的视图
    
        # 方式1:
        # return HttpResponse("<h1>%s</h1>"%str(t)[:19])
    
        # 方式2:
        from django.template import Template, Context
        templateobj=Template("<h2 style='color:red'>current time:{{time}}</h2>")
        contextobj=Context({"time":str(t)})
        html=templateobj.render(contextobj)
        return HttpResponse(html)
    
        #方式3
    #     return render(request,"time.html",{"time":str(t)[:19]})

     模板语法之变量

    在 Django 模板中遍历复杂数据结构的关键是句点字符  .

    具体实例如下:

    views:

    def index(request):
        name='I am dreaming'  #字符串
        i=100
        l=[111,222,333]    #列表
        dic={'name':'yuan','age':18}  #字典
    
        class Anminal(object):
            def __init__(self, name, color):
                self.name = name
                self.color = color
    
            def __str__(self):
                return self.name + str(self.color)
    
            def run(self):
                return 'is running'
    
        Anminal_dog1 = Anminal('拉布拉多1', '黑色')
        Anminal_dog2 = Anminal('拉布拉多2', '黑色')
        Anminal_dog3 = Anminal('拉布拉多3', '黑色')
    
        AnminalList = [Anminal_dog1, Anminal_dog2, Anminal_dog3]
        msg=[]    #空列表 
       
        label = "<a href=''>点击</a>"
    
        return render(request,'index.html',locals())  
        # return render(request,'index.html',{'name':name,'i':i,'l':l,'dic':dic,'Anminal_dog1':Anminal_dog1,'Anminal_dog2':Anminal_dog2,'Anminal_dog3':Anminal_dog3,'AnminalList':AnminalList})

    templates:

    <p>{{ name }}</p>
    <p>{{ name| length }}</p>
    <p>{{ name|slice:'5:' }}</p>
    <p>{{ i }}</p>
    <p>{{ l }}</p>
    <p>{{ l|length }}</p>
    <p>{{ dic}}</p>
    <p>{{ Anminal_dog1.name}}</p>
    <p>{{ Anminal_dog1.color}}</p>
    <p>{{ Anminal_dog3.run }}</p>
    <p>{{ AnminalList }}</p>
    <hr>
    {% for foo in AnminalList reversed%}
    <p>{{ foo }}</p>
    {% endfor %}
    <hr>
    {{ msg|default:"" }}
    <p>--------->{{ content|truncatechars:20 }}</p>
    <p>{{ content|truncatewords:5 }}</p>

    模板之过滤器

    语法:{{obj|filter__name:param}}

    default

    如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。例如:

    {{ value|default:"nothing" }}	
    

    length

    返回值的长度。它对字符串和列表都起作用。例如:

    {{ value|length }}

    filesizeformat

    将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB''4.1 MB''102 bytes', 等等)。例如:

    {{ value|filesizeformat }}

    如果 value 是 123456789,输出将会是 117.7 MB。  

    date

    如果value=datetime.datetime.now()

    {{ value|date:"Y-m-d" }}  

    slice

    如果 value="hello world"

    {{ value|slice:"2:-1" }}

    truncatechars

    如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。

    参数:要截断的字符数

    例如:

    	
    {{ value|truncatechars:9 }}

    如果value“Joel 是 >,输出将为“Joel i ...”

    safe

    Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。比如:

    value="<a href="">点击</a>"
    	
    {{ value|safe}}
    

    模板之标签

    标签看起来像是这样的: {% tag %}。标签比变量更加复杂:一些在输出中创建文本,一些通过循环或逻辑来控制流程,一些加载其后的变量将使用到的额外信息到模版中。

    一些标签需要开始和结束标签 (例如{% tag %} ...标签 内容 ... {% endtag %})。

    for标签

    遍历每一个元素:

    {% for person in person_list %}
        <p>{{ person.name }}</p>
    {% endfor %}

    可以利用{% for obj in list reversed %}反向完成循环。

    遍历一个字典:

    {% for key,val in dic.items %}
        <p>{{ key }}:{{ val }}</p>
    {% endfor %}

    自定义模板和过滤器 

    具体步骤如下:

    (1)在settings中的INSTALLED_APPS,是否有当前应用。

    (2)在应用中创建一个templatetags

    (3)在templatetags中创建py文件:mytag.py 

    (4)在mytag.py 中引入:

         from django import template
         from django.utils.safestring import mark_safe

         register = template.Library() #register的名字是固定的,不可改变

    (5)定义过滤器和标签
             @register.filter
              def multi(x,y):
              return x*y


            @register.simple_tag
              def multiTag(x,y,z):
             return x*y*z

     (6)在引用模板中导入:{% load myTag %}

      (7) 调用:
                过滤器: {{var|filter_name:参数}} # 参数只能是一个

                标签: {% simple_tag 参数1 参数2 ... %}

     模板继承

     

  • 相关阅读:
    【tarjan】【树的直径】【CF】K. Königsberg Bridges
    【组合数学】【恒等式】简单和、交错和
    【组合数学】【恒等式】$sum_{k=0}^{r}C_m^k imes C_{n}^{r-k}=C_{m+n}^r$
    【组合数学】【恒等式】$C_{n}^{r} imes C_{n-r}^{k-r}=C_{n}^{k} imes C_k^{r}$
    【树形DP】D. Serval and Rooted Tree
    【图论】图的欧拉定理
    【图论】网络流解决二分图最大匹配量问题
    【计算几何】atan2函数
    【单峰计数DP】Problem F – Fabricating Sculptures
    Java基础之:自定义泛型
  • 原文地址:https://www.cnblogs.com/moning/p/7725322.html
Copyright © 2011-2022 走看看