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

文章目录

  • Django模板层
  • Django模板层配置
  • Django模板层变量调用、代码嵌入与过滤器
    • 变量调用
    • python代码嵌入
    • 过滤器
  • Django模板层继承

Django模板层

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

Django模板层配置

首先在manage.py同目录下创建templates文件夹,用于放HTML等文件。
Django框架之模板层template的一些介绍和使用_第1张图片
然后我们需要告诉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>Documenttitle>
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框架之模板层template的一些介绍和使用_第2张图片

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>Documenttitle>
head>
<body>
    <h3>模板层!!!hello world !!{{username}}h3>
    <table>
        <tr>
            <td>inttd>
            <td>{{int}}td>
        tr>
        <tr>
            <td>strtd>
            <td>{{str}}td>
        tr>
        <tr>
            <td>list_onetd>
            <td>{{list.1}}td>
        tr>
        <tr>
            <td>dictstd>
            <td>{{dicts.A}}td>
        tr>
        <tr>
            <td>functd>
            <td>{{func}}td>
        tr>
        <tr>
            <td>objtd>
            <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

Django框架之模板层template的一些介绍和使用_第3张图片
能够看到变量都能够传输过来了。其中比较需要注意的就是列表元素的索引是 变量名.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>

运行服务器可得到:
Django框架之模板层template的一些介绍和使用_第4张图片
最下面一行就是嵌入的python代码发挥的作用。

过滤器

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

Django框架之模板层template的一些介绍和使用_第5张图片
举个例子就懂了。
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"] = ""
    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>Documenttitle>
head>
<body>
    <h3>模板层!!!hello world !!{{username}}h3>
    <table>
        <tr>
            <td>inttd>
            <td>{{int | add:"50"}}td>
        tr>
        <tr>
            <td>strtd>
            <td>{{str | upper}}td>
        tr>
        <tr>
            <td>list_onetd>
            <td>{{list.1}}td>
        tr>
        <tr>
            <td>dictstd>
            <td>{{dicts.A}}td>
        tr>
        <tr>
            <td>functd>
            <td>{{func}}td>
        tr>
        <tr>
            <td>objtd>
            <td>{{obj.say}}td>
        tr>
        <tr>
            <td>scripttd>
            <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>Documenttitle>
head>
<body>
    2022----------------------------------
    <br>
    {%block info %}
    这是主页
    {%endblock %}
body>
html>

child.html如下:

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

其中{% extends “father.html”%}表示继承father,html的内容,然后又重写了info块中的内容,因此会覆盖原内容,因此最后启动服务器后的结果如下:
Django框架之模板层template的一些介绍和使用_第6张图片
Django框架之模板层template的一些介绍和使用_第7张图片
可以发现只是修改了block info中的内容。
值得注意的是,模板继承时,模板传入的变量是无法继承的

你可能感兴趣的:(Django,django,python,后端)