一、模板的配置、绑定与渲染
1.模板的简介
模板可以动态生成html网页,它包括部分html代码和一些特殊的语法
2.template配置方法
- 一般存放在templates目录中
- 通过在项目settings的templates的DIRS列表中添加对应的路径即可,如os.path.join(BASE_DIR,’templates’)
3.template与视图的绑定
- 通过 from django.shortcuts import render 模块
- return render(request,template_path,{k:v}) 字典中的key和value就是要向前端渲染出来的数据
4.template展示渲染的数据
在html中以{{}}为标识,在双大括号中传入视图中传入的数据
5.实战举例
- 创建一个django项目:django-admin startproject template
- 进入项目目录:cd template/后,创建一个应用app:python3 manage.py startapp app
- 打开项目后,在该项目下创建一个文件夹templates,如下:
4.在项目根目录下的settings.py文件下,设置templates的DIRS:
5.在应用app中创建一个url.py文件,定义url:
from django.urls import path
from .views import Index
urlpatterns=[
path('',Index.as_view())
]
6.在应用中创建一个视图函数:
from django.shortcuts import render
from django.views.generic import View
# Create your views here.
class Index(View):
TEMPLATE='index.html'
def get(self,request,name):
return render(request,self.TEMPLATE)
7.在根目录下的路由urls.py注册app的url:
from django.contrib import admin
from django.urls import path,include
from app import urls as app_urls
urlpatterns = [
path('admin/', admin.site.urls),
path('',include(app_urls))
]
8.app应用下的url绑定视图:
from django.urls import path
from .views import Index
urlpatterns=[
path('',Index.as_view())
]
9.在新创建的模板文件下创建一个简单的html文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
hello {{name}}
</body>
</html>
10.启动本地服务,在浏览器中输入对应地址查看对应模板数据:python3 manage.py runserver
输入:http://127.0.0.1:8000/后查看到:
【拓展】在模板中展示渲染数据:
from django.shortcuts import render
from django.views.generic import View
# Create your views here.
class Index(View):
TEMPLATE='index.html'
def get(self,request,name):
return render(request,self.TEMPLATE,{'name':name})
from django.urls import path
from .views import Index
urlpatterns=[
path('<str:name>',Index.as_view())
]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
hello {{name}}//双大括号表示
</body>
</html>
结果为:
二、template的内置标签与静态配置
1.变量与标签
- 变量用{{}}双大括号包裹,比如后端渲染过来的数据
- 内置标签类型,用{%%}大括号左右各一个百分号包裹
2.静态文件配置
- 项目根目录创建‘static’与‘template’文件夹同级
- STATICFILES_DIRS=(os.path.join(BASE_DIR,’static’),)
静态文件包括:
- css样式文件
- JavaScript文件
- image图片文件等
3.静态文件配置与内置标签代码演示
3.1 内置标签代码演示
编写一个视图函数:
编写一个index.html的前端页面:(包含了上述几种内置标签)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>hello {{name}}</h1>
<ul>
{% for item in array %}
<li>{{ item }}---{{ forloop.counter0 }}---{{ forloop.counter }}----{{ forloop.revcounter }}----{{ forloop.revcounter0 }}
{% if forloop.first %}
is first
{% elif forloop.last %}
is last
{% endif %}
</li>
{% empty %}
<li>is empty</li>
{% endfor %}
</ul>
<a href="{% url 'index' 'conan' %}">return</a>
</body>
</html>
结果如下图:
点击return后结果:
3.2 静态文件配置代码演示
在static文件夹中新建一个css文件:
*{
margin:0;
padding: 0;
}
在模板文件夹中新建一个base html文件:
<!DOCTYPE html>
<html lang="en">
<head>
{% block head %}
<meta charset="UTF-8">
<title>{% block title %}{% endblock %}</title>
{% block css_style %}
{% endblock %}
{% endblock %}
</head>
<body>
{% block content %}
{% endblock %}
{% block js_script %}
{% endblock %}
</body>
</html>
编写index的html文件:
{% extends 'base.html' %}
{% load static %}
{% block css_style %}
<link rel="stylesheet" href="{% static 'index.css' %}">
{% endblock %}
{% block title %}
test
{% endblock %}
{% block content %}
<h1>hello {{ name }}</h1>
<ul>
{% for item in array %}
<li>{{ item}}</li>
{% endfor %}
</ul>
{% endblock %}
结果:
setting文件中配置静态文件:
STATIC_URL = '/static/'
STATICFILES_DIRS=(os.path.join(BASE_DIR,'static'),)
三、模板内置过滤器
1.过滤器的用处
- 用于在html模板中,对于渲染过来的数据进行二次操作使用
- 用来处理这些数据的模板引擎中使用的函数
2.常用过滤器介绍
常用过滤器实践说明:
from django.shortcuts import render
from django.views.generic import View
import datetime
# Create your views here.
class Index(View):
TEMPLATE='index.html'
def get(self,request,name):
data={}
data['name']=name
data['array']=range(10)
data['count']=20
data['time']=datetime.datetime.now()
data['cut_str']='hello-girl!'
data['first_big']='hello django!'
data['result']=False
data['dict_list']=[{'name':'test1','age':28},{'name':'test2','age':18}]
data['float_num']=3.1415926
data['html_str']='<div style="background-color:red;width:50px;height:50px"></div>'
data['a_str']='请看 www.baidu.com'
data['feature']=data['time']+datetime.timedelta(days=5)
#data['array']=[]
return render(request,self.TEMPLATE,data)
{% extends 'base.html' %}
{% load static %}
{% block css_style %}
<link rel="stylesheet" href="{% static 'index.css' %}">
{% endblock %}
{% block title %}
test
{% endblock %}
{% block content %}
<h1>hello {{ name }}</h1>
<ul>
{% for item in array %}
<li>{{ item}}</li>
{% endfor %}
</ul>
<br/>
<label>add:</label>{{ count|add:10 }}<br/>
<label>date:</label>{{ time|date:"Y-m-d H:i:s" }}<br/>
<label>cut:</label>{{ cut_str|cut:'-' }}<br/>
<label>first_big:</label>{{ first_big|capfirst }}<br/>
<label>default:</label>{{ result|default:"空列表" }}<br/>
<label>default_if_none:</label>{{ result|default_if_none:"none为空" }}<br />
<label>dictsort:</label>{{ dic_list|dictsort:'age' }}<br />
<label>dictsortreversed:</label>{{ dict_list|dictsortreversed:'age' }}<br />
<label>first:</label>{{ dict_list|first }}<br />
<label>last:</label>{{ dict_list|last }}<br />
<label>floatformat:</label>{{ float_num|floatformat:4 }}<br />
<label>join:</label>{{ array|join:"-" }}<br />
<label>length:</label>{{ dict_list|length }}<br />
<label>divisibleby:</label>{{ count|divisibleby:3 }}<br />
<label>length_is:</label>{{ dict_list|length_is:2 }}<br />
<label>safe:</label>{{ html_str|safe }}<br />
<label>random:</label>{{ dict_list|random }}<br />
<label>slice:</label>{{ html_str|slice:":10" }}<br />
<label>slugify:</label>{{ html_str|slugify }}<br />
<label>upper:</label>{{ html_str|upper }}<br />
<label>urlize:</label>{{ a_str|urlize }}<br />
<label>wordcount:</label>{{ first_big|wordcount }}<br />
<label>timeuntil:</label>{{ feature|timeuntil }}
{% endblock %}
运行结果如下:
3.自定义过滤器
定义自定义函数规则:
- 在应用下创建templatetags文件夹
- 在文件夹下创建myfilter.py
举例:
from django import template
register=template.Library()#定义过滤器
@register.filter
def test_filter(value,args):
return value+args
{%load myfilter%}
{{data |test_filter:3}}
四、其他模板介绍
1.jinja2简介
- 一套模仿Django模板的模板引擎,使用场景和Django模板相似
- 由flask开发者开发
- 速度快,被广泛使用
- 提倡让html设计者和后端Python开发工作分离
2.jinja2常用过滤器
3.mako简介
- 有比jinja更快的解析速度已经更多的语法支持
- 最大的特点在于允许你在html中随笔书写python代码