文章目录
- 概念
- 方法的使用
- 模板语法
- 模板过滤
- 模板标签tags
概念
模板层的作用:用于渲染向用户呈现的信息
Django的模板配置在settings.py文件内
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'templates']
,
'APP_DIRS': True,
'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',
],
},
},
]
BACKEND:
通过指定模板引擎类去实现Django的模板
DIRS:
定义了一个文件夹的列表,用于引擎查找模板的源文件
APP_DIRS:
在安装的APP里面查找模板引擎
OPTIONS:
包涵一些特殊的设置
方法的使用
首先我在templates下新建一个HTML模板,起名index
我想要的结果是,只要访问users就会进到首页上来了
接下来配置一下视图和路由
首先看users的视图:
想要返回首页首先要在视图里面定义一个首页视图函数index
这里需要return 一个render()函数
render里面第一个参数需要先写一个request,接下来就直接写HTML的页面文件名
def index(request):
return render(request, 'index.html')
上一篇看过render的底层代码,其中有一个content
content后面这个loader其实就是模板引擎的加载器
loader里面有两个函数去加载模板,即:get_template() 和 select_template()
可以通过render_to_string的底层代码查看
get_template() 和 select_template()这两个函数是if,else的关系,即二选一
模板就是用这两个动作来进行加载的
模板语法
接下来看下怎么做模板渲染
还是拿我的首页举例,如果我想把一些信息渲染到我的首页该怎么处理?
这里会涉及到变量{{variable}}
然后看下它是怎么传变量的
刚才在视图里已经定义了我的首页(index)了,接下来就是首页的内容了。
假设我想把用户名(暂定admin)和当前时间传到首页上面
还得回来看下render的函数定义
def render(request, template_name, context=None, content_type=None, status=None, using=None):
context就是我读的上下文
也就是所有要渲染的数据都要放在context里面,context里面默认放的是字典
用实际的例子看下视图里的context的写法
def index(request):
name = 'admin'
dtime = datetime.now()
return render(request, 'index.html', context={'name': name, 'dtime': dtime})
这里我已经有了两个值(name和dtime),然后用context把这两个值渲染到index里面去
然后再去看页面如何去接这两个值,那就得去修改index.html了
这两个值写在body里
然后就是去配置users的路由部分,path里面的这个name可写可不写
from django.urls import path
from users.views import index
app_name = 'users'
urlpatterns = [
path('', index, name='users_index')
]
然后就是启动项目运行
context能接收的类型:
str、int、float、list、tuple、dict、set、object(自定义类型)
接下来再来个访问量(int)
定义num=100
评分(float)
定义score=8.8
执行结果如下:
接下来看下列表怎么拿到
举个例子:
喜欢的电影
movies = [‘孙悟空大战蜘蛛人’,‘动物世界’,‘怪兽灭掉小日本’,‘战狼’]
def index(request):
name = 'admin'
dtime = datetime.now()
movies = ['孙悟空大战蜘蛛人','动物世界','怪兽灭掉小日本','战狼']
# return render(request, 'index.html', context={'name': name, 'dtime': dtime})
return render(request, 'index.html', context={'name': name, 'dtime': dtime, 'num': 100, 'score': 8.8, 'movies':movies})
这样写也可以
只是展示的时候是一行展示的
如下:
如果想把他一行一行分开展示,这里需要用到循环遍历了
另外如果只想取出列表中的某一个电影需要这样写{{movies.count}}其中count是一个具体的数字,类似于切片里的[count]
比如我喜欢的电影是战狼那就需要写成{{movies.3}},也是从0开始数的
如果想注释HTML里的某一段需要用{# 注释的部分 #}
好了,接着说正题,走循环!
在这里for循环和之前python3的for循环用法一样一样的
就是格式不太一样需要把for循环写到{% %}里面,反正HTML的写法有点别扭,慢慢适应吧,后面我还是考虑再单独写一篇关于HTML语法得博客,待我研究研究后面再写,这里先这样用着!!!
for循环就这么个写法,先照葫芦画瓢,后面再写个前端的专栏解释吧
<ul>
{% for movie in movies %}
<li>{{ movie }}</li>
{% endfor %}
</ul>
然后结果就漂亮了。。。
接下来还有字典类型dict
拿明星举例
这里取字典里的值的时候需要使用{{字典名.key}}来获取
结果:
最后看下自定义的类如何传的
先在视图文件里创建一个类
# -*- coding:utf-8 -*-
from datetime import datetime
from django.http import HttpResponse
from django.shortcuts import render
# Create your views here.
# 自定义的一个类
class Movie:
# 初始化一下
def __init__(self, name, director):
self.name = name
self.director = director
def __str__(self):
return self.name
def index(request):
name = 'admin'
dtime = datetime.now()
movies = ['孙悟空大战蜘蛛人', '动物世界', '怪兽灭掉小日本', '战狼']
stars = {'boys': '张继科', 'girls': '乔碧罗'}
# 自定义的类(电影名称,导演)
movieobj = Movie('战狼', '吴京')
# return render(request, 'index.html', context={'name': name, 'dtime': dtime})
return render(request, 'index.html',
context={'name': name, 'dtime': dtime,
'num': 100, 'score': 8.8,
'movies': movies,
'stars': stars,
'movieobj': movieobj})
这里取电影的名字就用{{类名.要取的东西}}
执行结果:
模板过滤
这里我简单说一下过滤器,其实我理解的过滤器就跟python基础里面的函数类型有点类似
这里常用到的过滤器类型有以下几个
lower、upper、title、capitalize、safe、length、default(默认值)、floatformat(浮点型的格式化)、random
使用过滤器的方法格式:{{变量名|过滤器}}
这么写可能有点不太清楚,下面先拿lower做个举例就知道了
这里我重新在视图里定义一个函数mytest
def mytest(request):
# 过滤器:lower、upper、title、capitalize、safe、length、default(默认值)、floatformat(浮点型的格式化)、random
msg = 'THIS is a messages'
return render(request, 'mytest.html', context={'msg':msg})
新建一个HTML模板,起名也叫mytest(主要是做个区分,名字不重要)
路由别忘了加上
lower其实就是把大写字母变成小写字母
这里我定义了msg里面有大写字母THIS
看下运行结果:
其他几个用法也是一样的
还有个floatformat(浮点型的格式化)
比如说我给一个数字num=12.333
{{num | floatformat:2}}
这就代表保留两位小数接下来还有random,
比如上面的电影movies
{{ movies | random }}
随机电影
最后还有一个切片slice
用法:{{ movies | slice:2 }}
大体总结一下:
模板标签tags
像这种的就是标签{% tag %}
放在大括号百分号里面的叫标签
看下tag的类型
上面那个for循环的for就是其中的一个
除了for还有if、elseif、block、extends、autoescape
{% autoescape off%} … {% endautoescape %}