Django框架之模板层template的一些介绍和使用

Posted Icy Hunter

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django框架之模板层template的一些介绍和使用相关的知识,希望对你有一定的参考价值。

文章目录

Django模板层

Django的模板层负责呈现内容到浏览器,简单来说就是用来放html等静态网页的东西的,便于前端界面的管理以及django自身的调用。

Django模板层配置

首先在manage.py同目录下创建templates文件夹,用于放HTML等文件。

然后我们需要告诉django模板放在哪里,因此还需要配置文件setting.py配置对应模板层的路径。

TEMPLATES = [
    
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        # 配置模板层的路径,项目绝对路径+模板层文件名=模板层路径
        'DIRS': [os.path.join(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',
            ],
        ,
    ,
]

配置好路径之后,就可以在templates文件夹下创建一个test_html.html
内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h3>模板层!!!hello world !!</h3>
</body>
</html>

随便放点东西就可以。

然后配置对应的路由和视图
配置视图
views.py:

from django.shortcuts import render
from django.http import HttpResponse

def test_html(request):
    return render(request, "test_html.html")

由于使用模板层,因此对应调用的代码也会简便许多。

配置路由
urls.py:

from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
    path("test_html", views.test_html),
]

然后运行服务器即可。
打开浏览器进入http://127.0.0.1:8000//test_html
看到以下内容说明模板层配置成功!

Django模板层变量调用、代码嵌入与过滤器

django的模板层网页变量数据的传输很方便,直接变量名即可传输,和jsp中java变量传输到网页之中差不太多,当然django模板层同样也能够嵌入python代码。

变量调用

django中能够传递的数据类型如下:
str、int、list、tuple、dict、func、obj

传递的方法列举:
变量名
变量名.index
变量名.key
变量名.方法
函数名

接下来举个例子应该就懂怎么操作了。

首先配置视图函数view.py:

from django.shortcuts import render
from django.http import HttpResponse

def hello():
    return "hello world"

class dog():
    def say(self):
        return "hellllllllll"

def test_html(request):
    dic = 
    dic["int"] = 88
    dic["str"] = "good"
    dic["list"] = ["A", "B", "C"]
    dic["dicts"] = "A":555, "B":666
    dic["func"] = hello
    dic["obj"] = dog()
    return render(request, "test_html.html", dic)

数据传输都只能够通过字典的形式传输过去,我们这里传输了一个int、一个str、一个list、一个字典、一个函数以及一个对象过去。

然后配置模板层的网页内容,templates文件夹下的test_html.html如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h3>模板层!!!hello world !!username</h3>
    <table>
        <tr>
            <td>int</td>
            <td>int</td>
        </tr>
        <tr>
            <td>str</td>
            <td>str</td>
        </tr>
        <tr>
            <td>list_one</td>
            <td>list.1</td>
        </tr>
        <tr>
            <td>dicts</td>
            <td>dicts.A</td>
        </tr>
        <tr>
            <td>func</td>
            <td>func</td>
        </tr>
        <tr>
            <td>obj</td>
            <td>obj.say</td>
        </tr>
    </table>
</body>
</html>

看代码应该就知道各种类型该怎么调用了。

配置路由urls.py:

from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
    path("test_html", views.test_html),
]

然后运行服务器,访问http://127.0.0.1:8000//test_html


能够看到变量都能够传输过来了。其中比较需要注意的就是列表元素的索引是 变量名.index(索引号)来索引。

python代码嵌入

python代码嵌入的话,语法应该差不多,只需要在<%%>中输入python代码即可调用。
我们接着刚才的配置,只需要将test_html.html中的内容加上python代码的调用即可看到效果。
test_html.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h3>模板层!!!hello world !!username</h3>
    <table>
        <tr>
            <td>int</td>
            <td>int</td>
        </tr>
        <tr>
            <td>str</td>
            <td>str</td>
        </tr>
        <tr>
            <td>list_one</td>
            <td>list.1</td>
        </tr>
        <tr>
            <td>dicts</td>
            <td>dicts.A</td>
        </tr>
        <tr>
            <td>func</td>
            <td>func</td>
        </tr>
        <tr>
            <td>obj</td>
            <td>obj.say</td>
        </tr>
    </table>
    %if dicts.A > 100 %
    hello world
    %else %
    good mornings world
    %endif %

    % for i in list%
    i
    %empty%
    空的
    %endfor %
    
</body>
</html>

运行服务器可得到:

最下面一行就是嵌入的python代码发挥的作用。

过滤器

模板过滤器,能通过过滤器来改变变量的输出显示
语法:变量|过滤器


举个例子就懂了。
views.py:

from django.shortcuts import render
from django.http import HttpResponse

def hello():
    return "hello world"

class dog():
    def say(self):
        return "hellllllllll"

def test_html(request):
    dic = 
    dic["int"] = 88
    dic["str"] = "good"
    dic["list"] = ["A", "B", "C"]
    dic["dicts"] = "A":555, "B":666
    dic["func"] = hello
    dic["obj"] = dog()
    dic["script"] = "<script>alert(6666)</script>"
    return render(request, "test_html.html", dic)

test_html.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h3>模板层!!!hello world !!username</h3>
    <table>
        <tr>
            <td>int</td>
            <td>int | add:"50"</td>
        </tr>
        <tr>
            <td>str</td>
            <td>str | upper</td>
        </tr>
        <tr>
            <td>list_one</td>
            <td>list.1</td>
        </tr>
        <tr>
            <td>dicts</td>
            <td>dicts.A</td>
        </tr>
        <tr>
            <td>func</td>
            <td>func</td>
        </tr>
        <tr>
            <td>obj</td>
            <td>obj.say</td>
        </tr>
        <tr>
            <td>script</td>
            <td>script | safe</td>
        </tr>
    </table>
</body>
</html>

路由没变,还是上一个例子的那个。
运行服务器,应该会有一个弹窗,然后int会加上50,str会变成大写。

Django模板层继承

平时上网的时候,我们可以发现很多网站里的网页都是有类似之处的,例如同一个网站里,最上面的导航栏以及最下面的版权块等等都是相同的,只是网页中间的核心内容变化了,为了提高代码的复用性,提高开发效率,django能够实现模板层的集成和重写,和面向对象的操作差不多。

下面举个例子就能直观的体会了。

首先配置路由,这里我们需要配置两个路由,分别进入父网页和子网页
urls.py:

from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
    path("father", views.father),
    path("child", views.child)
]

然后我们配置对应的视图函数:
views.py:

from django.shortcuts import render
from django.http import HttpResponse

def father(request):
    dic = 
    dic["a"] = 10
    return render(request, "father.html", dic)

def child(request):
    return render(request, "child.html")

最后我们需要配置对应的HTML,在templates文件夹下分别配置父网页和子网页的HTML。

django继承可修改的部分是以下格式:

%block 块名%
##########
%endblock%

这个块名中的东西如果被重写则会覆盖,剩余的东西则会被原封不动的继承下来。
那么father.html如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    2022----------------------------------
    <br>
    %block info %
    这是主页
    %endblock %
</body>
</html>

child.html如下:

% extends "father.html"%
%block info%
你好,欢迎光临,谢谢惠顾
%endblock%

其中% extends “father.html”%表示继承father,html的内容,然后又重写了info块中的内容,因此会覆盖原内容,因此最后启动服务器后的结果如下:


可以发现只是修改了block info中的内容。
值得注意的是,模板继承时,模板传入的变量是无法继承的

以上是关于Django框架之模板层template的一些介绍和使用的主要内容,如果未能解决你的问题,请参考以下文章

Django——模板层(template)(模板语法自定义模板过滤器及标签模板继承)

Django之模板Template

python--Django之模板层(template)

django之Template(模板)

Django之框架,视图,模板

Django学习系列之基础