Django学习——Django settings 源码、模板语法之传值、模板语法之获取值、模板语法之过滤器、模板语法之标签、自定义过滤器、标签、inclusion_tag、模板的导入、模板的继承
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学习——Django settings 源码、模板语法之传值、模板语法之获取值、模板语法之过滤器、模板语法之标签、自定义过滤器、标签、inclusion_tag、模板的导入、模板的继承的更多相关文章
- Django的View(视图)-settings源码的解析-模板层-模板语法
FBV与CBV 视图函数并不只是指函数,也可以是类 FBV:基于函数的视图,类似面向函数式编程 CBV:基于类的视图,类似面向对象编程 研究解析render源码: render:返回html页面:并且 ...
- django 之csrf、auth模块及settings源码、插拔式设计
目录 基于django中间件拷贝思想 跨站请求伪造简介 跨站请求伪造解决思路 方式1:form表单发post请求解决方法 方式2:ajax发post请求解决方法 csrf相关的两个装饰器 csrf装饰 ...
- 跨站请求伪造(csrf),django的settings源码剖析,django的auth模块
目录 一.跨站请求伪造(csrf) 1. 什么是csrf 2. 钓鱼网站原理 3. 如何解决csrf (1)思路: (2)实现方法 (3)实现的具体代码 3. csrf相关的装饰器 (1)csrf_p ...
- Django对中间件的调用思想、csrf中间件详细介绍、Django settings源码剖析、Django的Auth模块
目录 使用Django对中间件的调用思想完成自己的功能 功能要求 importlib模块介绍 功能的实现 csrf中间件详细介绍 跨站请求伪造 Django csrf中间件 form表单 ajax c ...
- Django的settings源码分析
Django其实有两个配置文件,一个是暴露给用户的可以自定义的配置,一个是项目默认的配置,用户如果配置了就用用户的,没有配置就用默认的. 首先需要在settings文件中导入,然后查看settings ...
- Django settings源码解析
Django settings源码 Django中有两个配置文件 局部配置:配置文件settings.py,即项目同名文件夹下的settings.py文件 全局配置:django内部全局的配置文件se ...
- (day59)十一、CSRF、Auth模块、impotlib模块、settings源码
目录 一.模拟实现中间件的编程思想 (一)impotlib模块 (二)实现功能的配置使用 二.跨站请求伪造CSRF (一)由来 (二)form表单的CSRF (三)ajax中的CSRF (1)通过da ...
- django----csrf跨站请求伪造 auth组件 settings源码 importlib模块
目录 importlib模块 csrf跨站请求伪造 form表单发送 ajax发送 csrf装饰器 auth模块 如何创建超级用户(root) 创建用户 校验用户名和密码是否正确 保存用户登录状态 判 ...
- Hadoop学习笔记(9) ——源码初窥
Hadoop学习笔记(9) ——源码初窥 之前我们把Hadoop算是入了门,下载的源码,写了HelloWorld,简要分析了其编程要点,然后也编了个较复杂的示例.接下来其实就有两条路可走了,一条是继续 ...
随机推荐
- Dubbo SPI 和 Java SPI 区别?
JDK SPI JDK 标准的 SPI 会一次性加载所有的扩展实现,如果有的扩展吃实话很耗时,但 也没用上,很浪费资源. 所以只希望加载某个的实现,就不现实了 DUBBO SPI 1,对 Dubbo ...
- ubuntu开启emqx/nginx/uwsgi自启动服务
一.emqx开机自启 a.首先在执行如下命令 vi /lib/systemd/system/emqx.service 创建了emqx.service文件然后在文件中写入如下内容 [Unit] Des ...
- Springmvc入门基础(五) ---controller层注解及返回类型解说
0.@Controller注解 作用:通过@Controller注解,注明该类为controller类,即控制器类,需要被spring扫描,然后注入到IOC容器中,作为Spring的Bean来管理,这 ...
- SpringMvc怎么和AJAX相互调用的?
通过Jackson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象.具体步骤如下 : (1)加入Jackson.jar (2)在配置文件中配置json的映射 (3)在接受Ajax方法 ...
- js技术之拖动table标签
一.js技术之拖动table标签 起因:前几天公司,突然安排一个任务 任务描述:要求尺码table列表要像Excel表中一样可以直接移动整行尺码到任意行位置 技术点:采用ui的sortable技术来h ...
- ctfhub web信息泄露备份文件下载(vim缓存 Ds-Store)
Vim缓存 进入环境由于不懂得vim是什么借鉴大佬的博客 网页提示flag在index.php中我们按着这个思路去找 将文件保存下来因为是swp文件我们用kail进行打开 使用vim -r index ...
- css 垂直居中方法汇总
查看原文可以有更好的排版效果哦 前言 居中是平时工作中的最常见的一种需求,各种图片居中或者各种弹窗,水平居中还好,特别是垂直居中,很多初学者表示太难写了,现在列举一些常用的方法. 实战 这里只讲述cs ...
- es8(字符串,对象)
es8(字符串,对象) 字符串补白: let str = "abc"; let a = str.padEnd(5); let b = str.padStart(5); let c ...
- 大数据学习之路之sqoop导入
按照网上的代码导入 hadoop(十九)-Sqoop数据清洗 - 简书 (jianshu.com) ./sqoop import --connect "jdbc:mysql://192.16 ...
- SpringMVC异常(404,接收参数类型转换错误)
内容 一.异常信息 HTTP Status 400 - type Status report message description The request sent by the client wa ...