Django基础4----Template模板之模板变量

Posted mzc1997

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django基础4----Template模板之模板变量相关的知识,希望对你有一定的参考价值。

模板

作为一个Web框架,Django需要一种方便的方式来动态生成html。最常见的方法依赖于模板。模板包含所需HTML输出的静态部分以及描述如何插入动态内容的特殊语法。

Django项目可以配置一个或多个模板引擎(如果不使用模板,甚至可以设置为零)。Django为其自己的模板系统提供内置后端,创造性地称为Django模板语言(DTL),以及流行的替代Jinja2。其他模板语言的后端可能来自第三方。

Django定义了一个用于加载和呈现模板的标准API,无论后端如何。加载包括为给定标识符查找模板并对其进行预处理,通常将其编译为内存中表示。渲染意味着用上下文数据插入模板并返回结果字符串。

Django的模板语言是Django自己的模板系统。在Django 1.8之前,它是唯一可用的内置选项。这是一个很好的模板库,尽管它颇有见地,并且体现了一些特质。如果您没有迫切的理由选择另一个后端,那么应该使用DTL,尤其是在编写可插入应用程序并且您打算分发模板时。包含模板的Django的contrib应用程序(如django.contrib.admin)使用DTL。

 

 

模板的组成:

html代码+views的逻辑控制代码

语法格式:{{ variable }}

 

Template和Context:模板和上下文

模板实质上就是html+内含的变量

Context就是可以在视图层的变量寻找对应的前端模板变量,进行匹配

 

Template模板:内含变量 name、times

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>djangotest</title>
    {% load staticfiles %}

</head>
<body>
<h2>hello  this is the first django project</h2>

<h1>hello:{{name}}时间:{{times}}</h1>


{#<script src="/static/jquery-3.1.1.js"></script>#}
<script src="{% static "jquery-3.1.1.js" %}"></script>
<script>
    $("h1").css("color","red")
</script>
</body>
</html>

 

views.py

from django.shortcuts import render, HttpResponse, render_to_response, redirect
import time
# Create your views here.


def clock_time(request):
    times = time.ctime()
    name = "mzc"
    
    # return render_to_response("index.html", {"times": times, "name":name})
    return render_to_response("index.html", locals())  # 当局部变量很多时,使用locals()识别局部变量方便

 

结果:

技术分享图片

 

如果这里还是不能够说明模板与Context的关系,

那就使用这个新的命令:>>>python manage.py shell   进入django调试终端

尝试以下代码:

>>>from django manage.py import Template, Context

>>>t = Template("hello {{ name }}")

>>>c = Context({"name": "mzc"})

>>>t.render(c)

out:  hello mzc

 

 

同一个模板,多个上下文,如果模板对象已经存在了,就可以使用这一个模板渲染多个Context,更为高效

low:

for name in (mzc,age,test):
    t = Template("hello {{ name }}")
    print(t.render(Context({"name":name})))

out:

hello mzc

hello age

hello test

 

good:

t = Template("hello {{ name }}")
for name in (mzc,age,test):

    print(t.render(Context({"name":name})))

out:

hello mzc

hello age

hello test

 

从上面结果看两者输出是相同的,但是前者创建了三次模板,后者只有一次。

 

模板中的变量可以为那些类型:

事实上可以为,列表,字典,对象:

 

eg:

show_name.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>hello {{ a.0 }}</h1>
<h1>hello {{ a.1 }}</h1>
<h1>hello {{ a.2 }}</h1>
<h1>hello {{ d.name }}</h1>
<h1>hello {{ d.age }}</h1>
<h1>hello {{ d.sex }}</h1>
<h1>hello {{ c.name }}</h1>
<h1>hello {{ c.sex }}</h1>


</body>
</html>

 

views.py

from django.shortcuts import render, HttpResponse
import time
# Create your views here.


class Application(object):
    def __init__(self, name, sex):
        self.name = name
        self.sex = sex


def show_name(request):

    a = [mzc, dhg, alex]

    d = {"name": "mzc", "age": 18, "sex": "girl"}

    c = Application("mzc", "girl")

    return render(request, "show_name.html", locals())  # 在逻辑层使用locals()方法  在Template中必须取值必须以函数内局部变量名称进行取值操作
    # 在模板中的渲染对象可以为列表、字典、对象

 

out:

技术分享图片

这里需要特别说明的就是不同类型的值是如何渲染在模板的:

通常的Python list dict这些要么通过索引取值,要么是通过键取值,而在模板语言中。

想要渲染出值:满足两点:

1.模板语言变量与视图函数对象类型相对于,如视图中一个字典为d  name模板变量也要为d

2.通过英文中的句号进行取值操作   如:视图函数中一个dict对象d,取值方式为d点key 取出值。


以上是关于Django基础4----Template模板之模板变量的主要内容,如果未能解决你的问题,请参考以下文章

Django 模板继承:如何阻止基础模板重新加载?

4 Template层 -模板继承

django基础知识之模板:

Django 基础模板文件

06-Django-基础篇-模板

Python基础之 Django模板