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

    变量的使用

    {{ }}:变量相关

    {% %}:逻辑相关

    def test(request):
        num =1
        s = 'hello'
        li = [1,2,['a','b']]
        dic = {'name':'zyl','password':'123'}
        tup = (1,2,3,4)
        se = {1,2,3}
        def my_test():
            return '你是猪'
        class test1:
            def __init__(self,name):
                self.name=name
            @classmethod
            def classM(cls):
                return '我是类方法'
            @staticmethod
            def staM():
                return '我是静态方法'
            def get_name(self):
                return self.name
    
            def __str__(self):
                return '大帅比'
        t=test1('zyl')
        return render(request,'test.html',locals())

    后端朝前端页面传递数据的方式

    第一种

    return render(request,'index.html',{'n':n})

    第二种

    return render(request,'index.html',locals())  

    在views中定义上面的函数,locals()是将当前所在的名称空间中的名字全部传递给前端页面

    后端传函数名到前端,会自动加括号调用,但是不支持传参,后端传对象到前端,就相当于打印了这个对象

    上图传入的变量有:整型,字符串,列表,字典,集合,元组,无参函数,类的对象

    前端test.html

    <h1>day57</h1>
    <p>数字:{{ num  }}</p>
    <p>字符串{{ s }}</p>
    <p>列表:{{ li }}</p>
    <p>字典:{{ dic }}</p>
    <p>元组:{{ tup }}</p>
    <p>集合:{{ se }}</p>
    <p>函数:{{ my_test }}</p>
    <p>对象:{{ t }}</p>   #得到的结果是一个内存地址,可以用__str__修改
    <p>对象属性:{{ t.name }}</p>
    <p>对象函数:{{ t.get_name}}</p>
    <p>类函数:{{ t.classM}}</p>
    <p>全局函数:{{ t.staM}}</p>

    前端获取后端传过来的容器类型的内部元素 统一采用句点符(.)

    {{ li }},{{ li.1 }}  数字对应的就是数据的索引

     模板中支持的写法:

    注意:传进来的函数一定不能是含参函数

    模板语法的注释

      不会展示到前端页面

    原生html的注释
      会展示到前端

    Filter(过滤器)

    语法:{{value|filter_name:参数}}

    '|'左右没有空格!

     过滤器会把左边的值当做一个个参数传给右边的过滤器,过滤器后面的值会当做第二个参数传递给过滤器

    常用过滤器:

    1、default:

    {{ flag|default: "没东西"}}

    如果value没有值就限时‘没东西’

    2、leagth:

    {{ li|length }}

    返回value的长度,如 value=['a', 'b', 'c', 'd']的话,就显示4.

    3、filesizeformat

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

    {{ file_size|filesizeformat }}

    4、slice

    从索引为0切到索引为4,不保留4,前闭后开,后面的参数可以为负数

    5、date

    格式化(不加%号)

    from datetime import datetime
        ctime = datetime.now()

    6、truncatechars

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

    参数:截断的字符数

    {{ s|truncatechars:7}}

    其中...也计算在内

    7、truncatewords

    和truncatechars不同,这是按照空格的数量截断的,同样的。截断的字符串将以可翻译的省略号序列(“...”)结尾。

    参数:截断的字符数

    {{ s|truncatewords:3}}

    其中...不算3个字符位置

    8、safe(********)

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

    前端取消转义

    {{ h1|safe}}

    后端取消转义

    from django.utils.safestring import mark_safe
        h1=mark_safe('<h1>我就是我</h1>')

    9、add

    num作为第一个参数,2作为第二个参数相加 如果两个都是数字的话就相加,如果其中有一个是字符串的话结果为‘ ’空

    如果两个参数都是字符串,执行字符串相加

    标签

    for循环

    {% for foo in l %} {# l = [1,2,3,4,5,6,7] #}
        <p>{{ foo }}</p>
    {% endfor %}

    结果:

    {% for foo in l %} {# l = [1,2,3,4,5,6,7] #}
    {#    <p>{{ foo }}</p>#}
        <p>{{ forloop }}</p>
    {% endfor %}

    结果:

    这是一个自定义对象  first,last标识当前for循环是第一次还是最后一次,如果是返回True,否则False

    count0:类似索引,后端枚举enumerate,

    if判断

    % if l %}
        <p>这个l有值</p>
    {% else %}
        <p>这个l没值</p>
    {% endif %}

    嵌套使用

    % for foo in l %} {# l = [1,2,3,4,5,6,7] #}
    {% if forloop.first %}
        <p>这是我的第一次</p>
    {% elif forloop.last%}
        <p>最后一次</p>
        {% else %}
        <p>继续嗨</p>
    {% endif %}

    结果:

    empty

    当你的for循环对象为空的时候会自动走empty代码块儿的内容
    后端:
    l = None

    前端

    {% for foo in l %} {# l = [1,2,3,4,5,6,7] #}
    {% if forloop.first %}
        <p>这是我的第一次</p>
    {% elif forloop.last%}
        <p>最后一次</p>
        {% else %}
        <p>继续嗨</p>
    {% endif %}
        {% empty %}
        <p>你给我的l为空不能for循环</p>
    {% endfor %}

    字典for循环

    {% for foo in dic %} {# l = [1,2,3,4,5,6,7] #}
    {{ foo }}
    {% endfor %}
    <p>一</p>
    {% for foo in dic.keys %}
        {{ foo }}
    {% endfor %}
    <p>二</p>
    {% for foo in dic.values %}
    {{ foo }}
    {% endfor %}
    <p>三</p>
    {% for foo in dic.hobby.0 %}
    {{ foo }}
    {% endfor %}
    <p>四</p>
    {% for foo in dic.items %}
    {{ foo }}
    {% endfor %}

    结果:

    模板with用法

    % with dic.hobby.2 as h %}
    {{ h }} 
    {% endwith %}
    {{ dic.hobby.2 }}

    给复杂获取值得代码重命名,方便下次使用

    注:重命名的变量只能在with里面使用

    自定义过滤器

    必须做的三件事

    1.在应用名下新建一个名为templatetags文件夹(必须叫这个名字)
    2.在该新建的文件夹内新建一个任意名称的py文件
    3.在该py文件中需要固定写下面两句代码
    from django import template        
    register = template.Library()

     自定义过滤器

    @register.filter(name='baby')
    def mu_sum(a,b):
        return a+b

    使用方法

    {% load my_tag  %}
    {{ xxx|baby:10 }}  {# xxx+10 #}

    自定义标签

    @register.simple_tag(name='plus')
    def plus(a,b,c):
        return '%s-%s-%s'%(a,b,c )

    使用方法

    {% load my_tag  %}
    {{ xxx|baby:10 }}  {# xxx+10 #}
    {% plus xxx 'egon' 'zyl'  %}

    注意:自定义的过滤器可以在if和for中使用,但是自定义的标签不能使用

    自定义inclusion_tag

    调用自定义的inclusion_tag能够返回一段html代码、

    比如form表单,表格,列表
    通常用于动态生成的HTML页面
    @register.inclusion_tag('login.html',name='login')
    def login(n):
        # l = []
        # for i in range(n):
        #     l.append('第%s项'%i)
        l = [ '第%s项'%i for i in range(n)]
        return {'l':l}
    # login.html
        <ul>
            {% for foo in l %}
            <li>{{ foo }}</li>
            {% endfor %}
        </ul>
    # 调用
    {% login 5 %}

    结果:

    注意 :要想使用自定义的过滤器 标签 inclusion_tag 必须先在需要使用的html页面加载你的py文件

    模板的继承与导入

    首先需要在被继承的模板中划分多个区域

    {% block 给区域起的名字 %}
    
    {% endblock %}

    通常情况下一个模板中应该至少有三块

    {% block css %}
        页面css代码块
    {% endblock %}
    
    {% block js %}
        页面js代码块
    {% endblock %}
    
    {% block content %}
        页面主体内容
    {% endblock %}

    子板继承模板

    先继承模板所有的内容
    {% extends 'home.html' %}
    
    然后根据block块的名字修改指定区域的内容
    {% block content %}
        <h1>登录页面</h1>
            <form action="">
                <p>username:<input type="text" class="form-control"></p>
                <p>password:<input type="text" class="form-control"></p>
                <input type="submit" class="btn btn-success">
            </form>
    {% endblock %}

    模板的导入:将一段html当做模块的方式导入到另一个html展示

    {% include '想导入的html文件名' %}

    静态文件配置

    {% load static %}  
    
    <link rel='stylesheet' href="{% static 'css/mycss.css'%}">  # 第一种方式
    <link rel='stylesheet' href="{% get_static_prefix %}css/mycss.css">  # 第二种方式
  • 相关阅读:
    Nbear实体和接口 CodeSmith模版
    prototype1.4版中文参考手册(word,pdf,chm)
    SharePoint 2013 (SharePoint 15)的新特性
    没有域环境下安装SharePoint 2010
    产品经理(PM)常用原型图设计工具
    【转贴】mysql导入数据load data infile用法
    重新学javaweb!
    关于HIbernate中的lazy属性的一些解释
    JAVA程序员基本测试题目
    添加sql server约束
  • 原文地址:https://www.cnblogs.com/zhengyuli/p/11005490.html
Copyright © 2011-2022 走看看