第五篇:Django的模板层

模板语法符号

{{ }}变量相关

模板层之模板传值

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

int、?oat、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(‘

    安全

    ‘)
    ```

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

{% %}逻辑相关

模板语法之标签

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中已存在配置,就会覆盖掉默认的配置,如果没有,就使用默认的 配置

原文地址:https://www.cnblogs.com/cnhyk/p/12173528.html

时间: 2024-07-30 18:38:17

第五篇:Django的模板层的相关文章

Django基础模板层(75-76)

Django框架之模板层(d75)一 模版语法之变量: ** locals() 会把*该*视图函数内的变量,传到模板    ** return render(request, 'index.html', locals()) 1 {{ 变量 }}:******重要******{#相当于print了该变量#}  只写函数名:相当于函数名(),执行该函数,打印函数返回值 2 深度查询---->统一都用句点符 .  拓展:不能调有参数的方法二 模版之过滤器 1语法:{{第一个参数|过滤器名字:第二个参数

053.Python前端Django框架模板层

模板层 一 模板语法之变量 在 Django 模板中遍历复杂数据结构的关键是句点字符, 语法: {{ var_name }} [[email protected] mysite]# cat app01/urls.py from django.urls import path,re_path from . import views urlpatterns = [ path("test/",views.test1,name="test1"), path("te

Django -- 7.模板层

模板层 我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python代码之中. def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html) 尽管这种技术便于解释视图是如何工作的,但直接将HT

Django之模板层

前面学习了Django的下载和基础的操作,掌握了其基本框架,接下来我们来学习Django中的模板语法. 学习任务:知道什么是模板,以及html+模板语法的具体用法 python的模板:HTML代码+模板语法 模版包括在使用时会被值替换掉的 变量,和控制模版逻辑的标签. #原始的视图 def timeHandle(request): import datetime t=datetime.datetime.now() #Django修改后的视图 # 方式1: # return HttpRespons

Django的模板层

将页面的设计和Python的代码分离开会更干净简洁更容易维护. 我们可以使用 Django的 模板系统 (Template System)来实现这种模式,这就是本章要具体讨论的问题. django的模板:HTML代码+模板语法: def timer(request): import time now_time = time.time() # html = "<html><body>现在时刻:<h1>%s.</h1></body><

7 Django的模板层

你可能已经注意到我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python代码之中. def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html) 尽管这种技术便于解释视图是如何工作的,但直

Django的模板层(1)

ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动. ORM是“对象-关系-映射”的简称 #sql中的表 #创建表: CREATE TABLE employee( id INT PRIMARY KEY auto_increment , name VARCHAR (20), gender BIT defa

Django之模板层-自定义过滤器以及标签

自定义标签与过滤器 在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag. 在app中创建templatetags模块(模块名只能是templatetags) 创建任意 .py 文件,如:my_tags.py from django import template # 该对象名必须是register register = template.Library() #自定义过滤器装饰器 @register.filter def mult

Django Template模板层 (下) ----------- 过滤器、人性化过滤器、模板继承、模板加载

---恢复内容开始--- 过滤器 除了模板标签可以帮助我们对数据或者进行逻辑处理.django 中还提供了一款工具叫做过滤器,过滤器也可以实现一些模板变量的运算,判断或是其他逻辑处理. add 语法: {{ var1|add:var2 }} add 过滤器可以实现 var1 与 var2 的相加,并且在遇到其他相同数据类型的,比如列表时,加号还可以重载为拼接功能 过滤器首先会将数据转换成Int类型,进行相加,如果转换失败,则会尝试使用 Python 中的数据类型 列表.元祖等这样的数据类型来进行