zoukankan      html  css  js  c++  java
  • 第五篇:Django的模板层

    模板语法符号

    {{ }}变量相关

    模板层之模板传值

    python基本数据类型全部支持传递给html文件

    int、float、str、list、tuple、dict、set、bool

    除此之外还可以传入函数,类和对象,其中函数和对象传入过去会自动加括号调用执行。

    模板语法不支持传参,所以有参函数和调用类传参这些都不支持

    后端给html文件传递数据的两种方式:
    1、指名道姓

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

    2、locals()

    会将当前名称空间中所有的变量名全部传递给html页面

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

    取值

    django模板语法取值,只有一种操作方式:句点符

    • .索引

    • .键

    <p>{{ l.2 }}</p>
    <p>{{ d.username }}</p>
    <p>{{ d.password }}</p>
    <p>{{ d.hobby.1.username.1 }}</p>
    

    模板语法之过滤器

    |length
    |add
    |default
    |truncatechars
    |truncatewords
    |filesizeformat
    |slice
    |date
    |safe
     
    <p>过滤器  |左边的会当做过滤器的第一个参数 过滤器名右边的会当做过滤器的第二个参数</p>
    <p>求数据长度:{{ s|length }}</p>
    <p>加法运算:{{ n|add:10 }}、{{ s|add:13132 }}、{{ s|add:'DSB' }}</p>
    <p>默认值(判断值是否为空):{{ b|default:'这个b布尔值是True' }}、{{ ff|default:'这个ff布 尔值是Flase' }}</p>
    <p>截取字符(截取5个字符 三个点也算):{{ s|truncatechars:8 }}</p>
    <p>截取单词(截取8个单词 三个点不算):{{ ss|truncatewords:8 }}、{{ sss|truncatewords:4 }}</p>
    <p>文件大小:{{ file_size|filesizeformat }}</p>
    <p>切片操作:{{ s|slice:'0:2' }}、{{ s|slice:"0:8:2" }}</p>
    <p>日期格式化:{{ ddd|date:'Y年/m月/d日' }}</p>
    <p>转义:{{ res|safe }}、{{ res1 }}、后端直接标识安全:{{ res2 }}</p>
    

    前后端取消转义

    • 前端

      • |safe
    • 后端

    from django.utils.safestring import mark_safe
    
    mark_safe('<h1>安全</h1>')
    

    总结:前端代码不一定非要在前端页面写,可以在后端写好传递给前端页面使用,这样的话,你就可以 利用到后端更加多的逻辑语法。

    {% %}逻辑相关

    模板语法之标签

    for循环:

    {% for foo in l %}  <!--l = [1,2,3,4,5,6]-->
        {% if forloop.first %}
            <p>这是我的第一次</p>
        {% elif forloop.last %}
            <p>这是最后一次了啊~</p>
        {% else %}
            <p>{{ foo }}</p>
        {% endif %}
        {% empty %}  # 当for循环没有执行的情况下执行下面
        <p>for循环的对象内部没有值</p>
    {% endfor %}
    

    自定义过滤器、标签、inclusion_tag

    定义自定义的过滤器、标签和inclusion_tag需要以下前期准备工作

    1、在应用名下新建一个名字必须叫 templatetags 文件夹

    2、在该文件夹内新建一个任意名称的py文件(eg: mytag)

    3、在该文件内,必须先写以下两句代码

    from django.template import Library
     
    register = Library()
    

    自定义过滤器

    mytag.py:

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

    html页面中:

    <p>自定义过滤器的使用</p>
    {% load mytag %}
    <p>{{ 10|my_sum:90 }}</p>  # 10传入到a,90传入b
     
    # 过滤器最多可以传入2个参数,如果想传入多个参数,可以将第二个参数传入列表
    

    自定义标签的使用

    mytag.py:

    @register.simple_tag(name='my_baby')
    def xxx(a, b, c, d):
        return '%s?%s?%s?%s?' % (a, b, c, d)
    

    html页面中:

    <p>自定义标签的使用</p>
    {% load mytag %}
    <p>{% my_baby 1 2 3 'hello world' %}</p>
    

    自定义过滤器和自定义标签的区别

    <p>自定义的过滤器可以在逻辑语句中而自定义的标签不可以</p>
    {% if 10|my_sum:100 %}
        <p>条件成立</p>
    {% endif %}
     
    {% if my_baby 1 2 3 4 %}
        <p>条件成立</p>
    {% endif %}
    

    自定义inclusion_tag

    my_tag.py:

    # 自定义inclusion_tag @register.inclusion_tag('demo.html',name='myin')
    def index1(n):
        l = []
        for i in range(n):
            l.append(i)
        # 将列表传递给demo.html
        # return locals()
        return {'l':l}
     
    

    html页面:

    <p>自定义inclusion_tag的使用</p>
    {% load mytag %}
    {% myin 5 %}
    # 总结 页面上使用他们 统一先导入
        {% load mytag %}
    

    模板的继承

    当某一个页面大部分区域都是公用的,那这个页面就可以作为模板页面

    当其他页面继承这个页面后,如何修改对应的区域?

    先在模板页面上通过block实现划定区域
        {% block content %}
            模板页面内容
        {% endblock %}
     
    子页面中先导入整个模板
        {% extends '模板页面.html'%}
        修改特定的区域  通过实现划定好的区域名称
        {% block content %}
            子页面内容
        {% endblock %}
     
    通常情况下 模板页面页面应该起码有三块区域
        {% block css %}
            模板页面内容
        {% endblock %}
     
        {% block content %}
            模板页面内容
        {% endblock %}
     
        {% block js %}
            模板页面内容
        {% endblock %}
    # 模板的block块越多 可扩展性越高
     
    # 还支持子页面调用父页面对应区域的内容 并且可以无限次调用
        {{ block.super }}
     
    

    模板的导入

    将html页面当做模块使用,哪里需要导哪里,这个html页面通常都不是完整的,只是一个局部样式。

    html页面:

    {% include 'left.html' %}
    

    插拔式设计

    基于django settings源码实现项目配置文件的 插拔式设计

    目录结构如下:

    conf中的settings文件是暴露给用户的文件 lib目录下的conf目录下的

    global_settings文件是内部配置文件

    # conf/settings.py
     
    NAME = '我是暴露给用户的配置文件'
    
    # lib/conf/global_settings.py
     
    NAME = '我是项目默认的配置文件'
    
    # start.py
    import os
    import sys
     
    BASE_DIR = os.path.dirname(__file__)
    sys.path.append(BASE_DIR)
     
    if __name__ == '__main__':
        # 项目启动,就应向全局大字典中设置键值对
        os.environ['xxx'] = 'conf.settings'
        # lib/conf下没有settings文件,会去conf下的管理模块的__init__中查找
        from lib.conf import settings
        print(settings.NAME)
    
    # lib/conf/__init__.py
     
    import importlib
    import os
    from lib.confimport global_settings
     
    class Settings(object):
        def __init__(self):
            # 先循环遍历项目默认的配置文件
            for name in dir(global_settings):
                # 判断变量名是否为大写
                if name.isupper():
                     # 键值对设置给对象
                     setattr(self, name, getattr(global_settings, name))
     
           # 先获取暴露给用户的配置文件的字符串路径
            # 获取start文件中的定义的全局大字典的xxx的values
            module_path = os.environ.get('xxx')
            # 通过importlib模块,导入暴露给用户的settings文件(conf下的)
            md = importlib.import_module(module_path)
            for name in dir(md):
                if name.isupper():
                    setattr(self, name, getattr(md, name))
     
     
    # 模块的单例模式,节省内存
    settings = Settings()
    

    实现效果就是如果conf中的settings中已存在配置,就会覆盖掉默认的配置,如果没有,就使用默认的 配置

  • 相关阅读:
    poj 3466 A Simple Problem with Integers
    java运行脚本语言demo
    Good Bye 2013---B. New Year Present
    游标-----内存中的一块区域,存放的是select 的结果
    Oracle 游标使用全解
    Oracle系列:记录Record
    10大协作办公工具:实现团队工作效率最大化
    如何有效使用Project(1)——编制进度计划、保存基准
    多项目同时进行如何做好进度管理
    @RISK
  • 原文地址:https://www.cnblogs.com/cnhyk/p/12173528.html
Copyright © 2011-2022 走看看