Django学习——Djangosettings源码、模板语法之传值、模板语法之获取值、模板语法之过滤器、模板语法之标签、自定义过滤器、标签、inclusion_tag、模板的导入、模板的继承

博客 分享
0 202
优雅殿下
优雅殿下 2022-05-02 09:58:42
悬赏:0 积分 收藏

Django学习——Django settings 源码、模板语法之传值、模板语法之获取值、模板语法之过滤器、模板语法之标签、自定义过滤器、标签、inclusion_tag、模板的导入、模板的继承

Django settings 源码

"""1.django其实有两个配置文件    一个是暴露给用户可以自定义的配置文件		项目根目录下的settings.py    一个是项目默认的配置文件		当用户不做任何配置的时候自动加载默认配置2.配置文件变量名必须是大写"""from django.conf import global_settings 查看源码global_settings.pyLANGUAGE_CODE = 'en-us' ('zh-hans', gettext_noop('Simplified Chinese'))疑问:为什么当用户配置了就使用用户配置的 不配置就使用默认的from django.conf import settingssettings = 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.pyfrom django import templateregister = template.Library()# 自定义过滤器@register.filter(name='myfilter')def index(a,b):    # 简单的加法运算    return a + bindex.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_tagapp01\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 >注册</h1>    <form action="">        <p><input type="text" ></p>        <p><input type="text" ></p>        <input type="submit" >    </form>{% endblock %}母版在划定区域的时候一般都应该由三个区域	css区域	html文档区域	js区域	ps:目的是为了让子版具有独立的css js等 增加扩展性	{% block css %}            {% endblock %}    	{% block content %}            {% endblock %}    	{% block js %}            {% endblock %}    ps:子版也可以继续使用母版划定区域内的内容	{{ block.super }}
posted @ 2022-05-02 09:32 PENGJUNQIAO 阅读(0) 评论(0) 编辑 收藏 举报
回帖
    优雅殿下

    优雅殿下 (王者 段位)

    2018 积分 (2)粉丝 (47)源码

    小小码农,大大世界

     

    温馨提示

    亦奇源码

    最新会员