文章目录

  • 概念
  • 方法的使用
  • 模板语法
  • 模板过滤
  • 模板标签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

python draw 孙悟空_html


python draw 孙悟空_django_02

我想要的结果是,只要访问users就会进到首页上来了
接下来配置一下视图和路由
首先看users的视图:
想要返回首页首先要在视图里面定义一个首页视图函数index
这里需要return 一个render()函数
render里面第一个参数需要先写一个request,接下来就直接写HTML的页面文件名

def index(request):
    return render(request, 'index.html')

上一篇看过render的底层代码,其中有一个content

python draw 孙悟空_python_03


content后面这个loader其实就是模板引擎的加载器

loader里面有两个函数去加载模板,即:get_template() 和 select_template()

可以通过render_to_string的底层代码查看

python draw 孙悟空_python draw 孙悟空_04


python draw 孙悟空_python_05


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里

python draw 孙悟空_django_06

然后就是去配置users的路由部分,path里面的这个name可写可不写

from django.urls import path

from users.views import index

app_name = 'users'
urlpatterns = [
    path('', index, name='users_index')
]

然后就是启动项目运行

python draw 孙悟空_python_07


context能接收的类型:

str、int、float、list、tuple、dict、set、object(自定义类型)

接下来再来个访问量(int)

定义num=100

评分(float)

定义score=8.8

python draw 孙悟空_python draw 孙悟空_08


python draw 孙悟空_django_09

执行结果如下:

python draw 孙悟空_python_10


接下来看下列表怎么拿到

举个例子:

喜欢的电影

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})

python draw 孙悟空_html_11


这样写也可以

只是展示的时候是一行展示的

如下:

python draw 孙悟空_python_12


如果想把他一行一行分开展示,这里需要用到循环遍历了

另外如果只想取出列表中的某一个电影需要这样写{{movies.count}}其中count是一个具体的数字,类似于切片里的[count]

比如我喜欢的电影是战狼那就需要写成{{movies.3}},也是从0开始数的

python draw 孙悟空_django_13


python draw 孙悟空_html_14


如果想注释HTML里的某一段需要用{# 注释的部分 #}

python draw 孙悟空_django_15


好了,接着说正题,走循环!

在这里for循环和之前python3的for循环用法一样一样的

就是格式不太一样需要把for循环写到{% %}里面,反正HTML的写法有点别扭,慢慢适应吧,后面我还是考虑再单独写一篇关于HTML语法得博客,待我研究研究后面再写,这里先这样用着!!!

for循环就这么个写法,先照葫芦画瓢,后面再写个前端的专栏解释吧

<ul>
{% for movie in movies %}
    <li>{{ movie }}</li>
{% endfor %}
</ul>

然后结果就漂亮了。。。

python draw 孙悟空_django_16


接下来还有字典类型dict

拿明星举例

python draw 孙悟空_models_17


这里取字典里的值的时候需要使用{{字典名.key}}来获取

python draw 孙悟空_python_18


结果:

python draw 孙悟空_html_19

最后看下自定义的类如何传的
先在视图文件里创建一个类

# -*- 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 draw 孙悟空_python_20


这里取电影的名字就用{{类名.要取的东西}}

执行结果:

python draw 孙悟空_python draw 孙悟空_21

模板过滤

这里我简单说一下过滤器,其实我理解的过滤器就跟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(主要是做个区分,名字不重要)

python draw 孙悟空_python draw 孙悟空_22


路由别忘了加上

python draw 孙悟空_models_23

lower其实就是把大写字母变成小写字母

这里我定义了msg里面有大写字母THIS

看下运行结果:

python draw 孙悟空_html_24


其他几个用法也是一样的

python draw 孙悟空_html_25

python draw 孙悟空_html_26


还有个floatformat(浮点型的格式化)

比如说我给一个数字num=12.333

{{num | floatformat:2}}

这就代表保留两位小数接下来还有random,

比如上面的电影movies

{{ movies | random }}

随机电影

python draw 孙悟空_python_27


python draw 孙悟空_python_28


python draw 孙悟空_django_29


python draw 孙悟空_django_30


最后还有一个切片slice

用法:{{ movies | slice:2 }}

python draw 孙悟空_django_31


大体总结一下:

python draw 孙悟空_python_32

模板标签tags

像这种的就是标签{% tag %}

放在大括号百分号里面的叫标签

看下tag的类型

上面那个for循环的for就是其中的一个

除了for还有if、elseif、block、extends、autoescape

{% autoescape off%} … {% endautoescape %}

python draw 孙悟空_python_33

python draw 孙悟空_html_34


python draw 孙悟空_html_35