Django学习——Django settings 源码、模板语法之传值、模板语法之获取值、模板语法之过滤器、模板语法之标签、自定义过滤器、标签、inclusion_tag、模板的导入、模板的继承
2022-05-02 09:32
2811 查看
Django settings 源码
""" 1.django其实有两个配置文件 一个是暴露给用户可以自定义的配置文件 项目根目录下的settings.py 一个是项目默认的配置文件 当用户不做任何配置的时候自动加载默认配置 2.配置文件变量名必须是大写 """ from django.conf import global_settings 查看源码 global_settings.py LANGUAGE_CODE = 'en-us' ('zh-hans', gettext_noop('Simplified Chinese')) 疑问:为什么当用户配置了就使用用户配置的 不配置就使用默认的 from django.conf import settings settings = LazySettings() manage.py文件 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djangoProject.settings') ENVIRONMENT_VARIABLE = "DJANGO_SETTINGS_MODULE" class LazySettings(LazyObject): def _setup(self, name=None): # os.environ看成是一个全局大字典 'djangoProject.settings' settings_module = os.environ.get(ENVIRONMENT_VARIABLE) self._wrapped = Settings(settings_module) # Settings('djangoProject.settings') class Settings: def __init__(self, settings_module): # 'djangoProject.settings' # update this dict from global settings (but only for ALL_CAPS settings) for setting in dir(global_settings): # 获取全局配置文件里面所有的(大写)变量名 if setting.isupper(): # 校验判断变量名是否是纯大写 setattr(self, setting, getattr(global_settings, setting)) # 给Settings对象添加全局配置文件中所有的配置信息 # 例如 self.NAME = 'jason' # getattr(global_settings, setting) 获取全局设置文件中大写变量名对应的值 # 大写变量名为健,对应的值为值 # store the settings module in case someone later cares self.SETTINGS_MODULE = settings_module # 'djangoProject.settings' mod = importlib.import_module(self.SETTINGS_MODULE) # from djangoProject import settings # 导入暴露给用户的自定义配置文件 # importlib.import_module 传入一个字符串(项目名字是动态变化的)可以导入相关模块 for setting in dir(mod): if setting.isupper(): setting_value = getattr(mod, setting) setattr(self, setting, setting_value)
单例模式 反射
功能的可插拔式配置
# import os # print(os.environ) # 固定的全局大字典 # d = {} # d['name'] = 'jason' # d.setdefault('xxx','lili') # print(d) # print(dir(d)) import importlib # 传入一个字符串可以导入
模板语法之传值
# 传值方式1:利用字典挨个传值 return render(request,'index.html',{'i':i,'f':f,'s':s,'l':l,'d':d,'t':t,'se':se,'b':b}) # 传值方式2:简单粗暴 locals()将当前名称空间中所有的变量名全部传递给页面 return render(request,'index.html',locals()) """ 传值方式1 传值精确 不会造成资源浪费 传值方式2 传值粗糙 可能会造成一定的资源浪费 ps:为了教学方便 我们以后就是用locals() """ 补充:传递函数名和类名都会自动加括号调用(模板语法不支持额外的传参)
模板语法之获取值
"""模板语法取值只能采用 句点符(.)""" 索引 健都可以无限制的点点点 <p>{{ d.hobby.3.username }}</p>
模板语法之过滤器
# 类似于python的内置方法 <p>过滤器:将竖杠左侧的数据当做第一个参数</p> <p>统计长度:{{ s|length }}</p> <p>加法运算:{{ i|add:100 }}</p> <p>字符串拼接:{{ s|add:'love' }}</p> <p>日期格式:{{ ctime|date:'Y年-m月-d日' }}</p> <p>默认值:{{ b|default:'中国' }}</p> <p>默认值:{{ b1|default:'中国' }}</p> <p>文件大小:{{ file_size|filesizeformat }}</p> <p>截取文本(引号也算 按字符截取):{{ s|truncatechars:3 }}</p> <p>截取文本(引号不算 按空格截取):{{ s|truncatewords:3 }}</p> <p>前端取消转义:{{ h|safe }}</p> <p>{{ sss }}</p> 转义 前端 <p>前端取消转义:{{ h|safe }}</p> 后端 # 后端取消转义 from django.utils.safestring import mark_safe sss = mark_safe('<h2>学而不思则罔</h2>') ps:前端代码也可以在后端写好传入!!!
模板语法之标签
# 类似于python的流程控制 {% if b1 %} <p>有值</p> {% else %} <p>无值</p> {% endif %} {% for foo in l %} {# <p>内置对象:{{ forloop }}</p>#} <p>{{ foo }}</p> {% endfor %} {% for foo in s %} {% if forloop.first %} <p>这是我的第一次</p> {% elif forloop.last %} <p>这是我的最后一次</p> {% else %} <p>{{ foo }}</p> {% endif %} {% empty %} <p>传入的数据是空的 不存在</p> {% endfor %} """ {{}} 变量相关 {%%} 逻辑相关 """ # 了解 {% with d.username as name %} {{ name }} {{ name }} {{ d.username }} {% endwith %}
自定义过滤器、标签、inclusion_tag
# 类似于python里面的自定义函数 1.在应用下创建一个名字必须叫"templatetags"文件夹 2.在上述文件夹内创建一个任意名称的py文件 3.在该py文件内固定先书写以下两句话 from django import template register = template.Library() app01\templatetags\mytag.py from django import template register = template.Library() # 自定义过滤器 @register.filter(name='myfilter') def index(a,b): # 简单的加法运算 return a + b index.html {% load mytag %} {{ i|myfilter:666 }} # 自定义标签 app01\templatetags\mytag.py @register.simple_tag(name='mysimple') def func1(a,b,c,d): return '%s-%s|%s?%s'%(a,b,c,d) index.html {% load mytag %} {% mysimple 1 'jason' 222 'egon' %} inclusion_tag 当某个区域需要反复使用并且数据不是固定的 # 自定义inclusion_tag app01\templatetags\mytag.py @register.inclusion_tag('login.html',name='my_inclusion_tag') def func2(n): l = [] for i in range(1,n+1): l.append('第%s页'%i) return locals() index.html {% load mytag %} {% my_inclusion_tag 10 %} djangoProject\templates\login.html <ul> {% for foo in l %} <li>{{ foo }}</li> {% endfor %} </ul>
模板的导入
# 类似于后端导入模块 想要什么局部页面直接导入即可 {% include 'myform.html' %}
你学会了什么都不重要,你学不会什么都重要
模板的继承
先使用block划定区域 母版 {% block 区域名称 %} {% endblock %} 子版 {% extends 'home.html'%} {% block 区域名称 %} {% endblock %} 实例: {% extends 'home.html'%} {% block content %} <h1 class="text-center">注册</h1> <form action=""> <p><input type="text" class="form-control"></p> <p><input type="text" class="form-control"></p> <input type="submit" class="btn btn-danger btn-block"> </form> {% endblock %} 母版在划定区域的时候一般都应该由三个区域 css区域 html文档区域 js区域 ps:目的是为了让子版具有独立的css js等 增加扩展性 {% block css %} {% endblock %} {% block content %} {% endblock %} {% block js %} {% endblock %} ps:子版也可以继续使用母版划定区域内的内容 {{ block.super }}
相关文章推荐
- django 模板层:模板语法、自定义过滤器和标签、模板继承和导入;模型层:正反向,聚合,分组查询、F、Q...
- Django框架模板语法传值-过滤器-标签-自定义过滤器,标签,inclusion_tag
- Django——模板层(template)(模板语法、自定义模板过滤器及标签、模板继承)
- django自定义模板过滤器和模板标签
- 在Django的模板中自定义过滤器,使用markdown语法展示个人博客中的内容
- Django入门教程(五)自定义模板标签和过滤器
- 第五章 python Django 模版【模板标签 模板过滤器 模板继承 加载静态文件】
- Django第五课之自定义模板过滤器及标签
- django 自定义模板标签和过滤器
- Django 模板的语法变量、标签、过滤器 笔记
- Django模板渲染之自定义inclusion_tag详细使用
- Django自定义模板过滤器和标签的实现方法
- django “如何”系列4:如何编写自定义模板标签和过滤器
- django过滤器(Filters)&&标签(tags)&&模板继承&&组件
- 自定义Django模板过滤器和标签
- django 自定义模板标签和过滤器
- Django2.0 自定义模板标签 assignment_tag 应该 改为 simple_tag
- django模板继承常用标签和规则(看django源码遇到了{{ block.super }})
- django学习笔记---模板语言继承和simple_tag
- Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】