一、 模版文件查找规则(顺序)
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不可以