博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

模板语法

Posted on 2022-03-02 14:53  ~sang  阅读(84)  评论(0编辑  收藏  举报

django settings源码

"""
1.django其实有两个配置文件
一个是暴露给用户可以自定义的配置文件
项目根目录下的settings.py
一个是项目默认的配置文件
当用户不做任何配置的时候自动加载默认配置
2.配置文件变量名必须是大写0
"""
疑问:为什么当用户配置了就使用用户配置的 不配置就是要默认的
from django.conf import settings

settings = LazySettings()

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day05.settings")
ENVIRONMENT_VARIABLE = "DJANGO_SETTINGS_MODULE"
class LazySettings(LazyObject):
   def _setup(self, name=None):
       # os.environ看成是一个全局大字典     'day05.settings'
       settings_module = os.environ.get(ENVIRONMENT_VARIABLE)
       self._wrapped = Settings(settings_module)  # Settings('day05.settings')

class Settings(object):
   def __init__(self, settings_module):  # 'day05.settings'
       for setting in dir(global_settings):  # 获取全局配置文件里面所有的变量名
           if setting.isupper():  # 校验是否是纯大写
               setattr(self, setting, getattr(global_settings, setting))
               # 给Settings对象添加全局配置文件中所有的配置信息
       
       self.SETTINGS_MODULE = settings_module  # 'day05.settings'
       mod = importlib.import_module(self.SETTINGS_MODULE)
       # from day05 import settings # 导入暴露给用户的自定义配置文件
       for setting in dir(mod):
           if setting.isupper():
               setting_value = getattr(mod, setting)
               setattr(self, setting, setting_value)

模板语法之传值

# 传值方式1:利用字典挨个传值
return render(request,'index.html',{'i':i,'f':f,'s':s,'d':d,'l':l})
# 传值方式2:locals()将当前名称空间中所有的变量名全部传递给页面
return render(request,'index.html',locals())
'''
传值方式1 传值精确 不会造成资源浪费
传值方式2 可能会造成一定的资源浪费
传递函数名和类名都会自动加括号调用(模板语法不支持额外的传参)
'''

模板语法之获取值

'''django模板语法取值只能采用 句点符(.)'''
# 索引 键都可以无限制的点点点
d={'name':'ldb','age':18,'hobby':['basketball','football','reading']}
{{ d.hobby.1 }}

模板语法之过滤器

# 类似于python的内置方法
'''过滤器:将管道符左侧的数据当做第一个参数传给右侧'''
<p>统计长度:{{ l|length }}</p>
<p>加法运算:{{ i|add:222 }}</p>
<p>字符串拼接:{{ s|add:'hello' }}</p>
<p>日期格式:{{ ctime|date:'Y年-m月-d日' }}</p>
<p>默认值:{{ b|default:'哈哈' }}</p>
<p>默认值:{{ b1|default:'哈哈' }}</p>
<p>文件大小:{{ file_size|filesizeformat }}</p>
<p>截取文本(三个点也算):{{ s|truncatechars:6 }}</p>
<p>截取文本(三个点不算)空格:{{ s|truncatewords:3 }}</p>
<p>{{ h|safe }}</p>
<p>{{ s1 }}</p>
<p>{{ s2 }}</p>
转义
前端
  |safe
   后端
  from django.utils.safestring import mark_safe
       s2=mark_safe('<h2>用户注册</h2>')
   # 前端代码也可以在后端写好传入

模板语法之标签

# 类似于python的流程控制
{% 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.hobby.3.username as name %}
  {{ name }}
  {{ d.hobby.3.username }}
{% endwith %}

自定义过滤器、标签、inclusion_tag

# 类似于python里面的自定义函数
1.在应用下创建一个名字必须叫"templatetags"文件夹
2.在上述文件夹内创建一个任意名称的py文件
3.在该py文件内固定先书写以下两句代码
from django import template

   register = template.Library()


   # 自定义过滤器
   @register.filter(name='myfilter')
   def index(a, b):
       # 简单的加法运算
       return a + b


   # 自定义标签
   @register.simple_tag(name='mysimple')
   def func1(a, b, c, d):
       return '%s-%s-%s-%s' % (a, b, c, d)


   # 自定义inclusion_tag
   @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()
前端
{% load mytag %}
  {{ i|myfilter:666 }}

  {% mysimple 1 'jason' 222 'egon' %}

  {% my_inclusion_tag 10 %}
  {% my_inclusion_tag 8 %}

# inclusion_tag 当某个区域需要反复使用并且数据不是固定的

模板的导入

# 类似于后端导模块 想要什么局部页面直接导入即可
{% include 'myform.html' %}

模板的继承

先使用block划定区域
母版
  {% block 区域名称 %}
  {% endblock %}
子版
{% extends 'home.html' %}
  {% block 区域名称 %}
{% endblock %}
 
母版在划定区域的时候一般都应该有三个区域
  css区域
  html文档区域
  js区域
  ps:目的是为了让子版具有独立的css js等 增加扩展性
  {% block css %}

  {% endblock %}
   
  {% block content %}

  {% endblock %}
   
  {% block js %}

  {% endblock %}

ps:子版也可以继续使用母版划定区域内的内容
  {{ block.super }}