Django 模版文件

一、 模版文件查找规则(顺序)

1、优先去项目根目录下的templates下寻找

匹配根目录下的模版文件需要在setting.py文件中设置,setting.py文件中的DIRS没有设置就根据APP的注册顺序去寻找模版文件

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],   # 请每次创建完一个django项目之后,都检查下这个路径,确保这个路径是完备的,匹配根目录下的templates文件根据这个值来设置
        'APP_DIRS': True,   # 允许django去app中寻找模板文件
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config',
]

2、去APP内寻找模版文件

如果根目录没有设置模版文件,那么就根据APP的注册顺序去寻找模版文件,APP_DIRS必须设置为True


TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],   # 请每次创建完一个django项目之后,都检查下这个路径,确保这个路径是完备的,匹配根目录下的templates文件根据这个值来设置
        'APP_DIRS': True,   # 允许django去app中寻找模板文件
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config',
]

3、注意事项

DIRS:这个是我们模板文件存放的路径,一般在项目根目录下
APP_DIRS:当值为True时,允许django去app中寻找模板文件,也就是说,当你各个app都有自己单独的模板文件时,需要将这个参数设置为True。
APP必须是已注册

二、django在寻找模板文件时:

1、首先会寻找DIRS指定的模板文件,你也可以认为是公共的模板文件存放目录。

按照settings中INSTALLED_APPS中注册app的顺序去寻找模板文件,所以,并不是每个app都会优先寻找自己app内部的模板文件。

2、如果各个app内如果有自己的模板文件,那么建议在各自app内的templates目录内再创建一个目录,用来存放你的模板文件,防止出现被别的app中同名的模板文件截胡的情况出现。

3、参数传递

在这里插入图片描述

在这里插入图片描述

三、模版渲染过程

1、寻找模版文件,如果setting.py文件中已设置先找项目根目录下的templates文件,若没有根据APP的注册顺序去寻找到模版文件
2、读取文件内容–普通方式
读取文件内容 +参数 ----》模版渲染(替换)【模版语法】-- 模版替换法
3、封装到HttpResponse的请求体中
4、返回到用户的浏览器

四、底层原理

在这里插入图片描述

HTML通过一个_execute() 函数加载到 一个buffer 的空列表里面
再通过compile函数执行_execute

在这里插入图片描述

namespace = {'name': 'wangyibo'}
info ="""
def _execut():
    _buffer =[]
    _buffer.append("<h1>")
    _buffer.append(name)
    _buffer.append("123")
    _buffer.append("</h1>")
    return "".join(_buffer)
     
"""
func = compile(info,'<string>','exec')
exec(func,namespace)
result = namespace["_execut"]()
print(result)

五、模版文件的继承和导入

1、继承 -->公共模版可以用到

在这里插入图片描述

在这里插入图片描述

2、include 导入–>某些模版文件的片段可以复用,用到导入

在这里插入图片描述

在这里插入图片描述

3、注意事项

include 可以多次使用,导入只能一次

六、自定义函数模版

步骤

1、settings.py中的INSTALLED_APPS列表中,配置app,不然Django无法找到自定义过滤器。app已注册
2、在app中创建templatetags目录,注意,目录名只能叫做templatetags
3、templatetags目录内,创建任意py文件,比如mytag.py,然后写你自定义的逻辑。
4、前端页面使用{{}}引入

分类

1、自定义函数可分为三大类simple_tag,inclusion_tag,filter
在这里插入图片描述

在这里插入图片描述

from django.shortcuts import render,HttpResponse
def nb(request):
    #1、读取nb.html文件的内容
    #2.温染=替换,替换光成后
    #3.将替换后的值时装HttpReponse
    #4.以响应体的方式返回到浏览器的界面
    #return render(request,'app01/nb.html',{'info':"张开"})
    #return render(request,'app01/nb.html',{'info':[11,22,33,55]})
    return render(request,
                  'app01/nb.html',
                  {'num':[11,22,33,44],
                   'name':'张开'
                   }
                  )

'''
from django.template.library import Library
register = Library()
@register.simple_tag()
def my_func(v1,v2,v3):
    return '哈哈哈'+v1+v2+v3

@register.inclusion_tag('app01/xo.html')
def my_exo(num):
    return {'x1':[item for item in num if item>22]}

@register.filter()
def my_tt(a1,a2):
    return '哈哈' + a1 + a2
{% load mytags %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>{{ num }}</div>
    <div>{{ name }}</div>
    <!---函数后面的代表参数,函数在templatetag文件中建立的--->
    <div>{% my_func "大法师" 'dfds' name %}</div>
    <div>{% my_exo num %}</div>
    <div>{{ 'sdff'|my_tt:'dedfg' }}</div>
{% if 'sdff'|my_tt:'dedfg' %}
    <h1></h1>
{% else %}
    <h1></h1>
{% endif %}
</body>
</html>
<ul>
    {% for item in x1 %}
        <li>{{ item }}</li>
    {% endfor %}

</ul>

filter函数内部自带

1、filter函数最多只能加两个参数

2、filter可以进行条件判断,其他两个simple_tag,inclusion_tag不可以

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值