Django模板语言变量实例教程

147 阅读3分钟

Django模板语言是一种特殊的语法,用于Django Web框架所使用的HTML文件内部。DTL是一种增强的HTML形式,它利用标准的HTML语法与Django特定的模板语言相结合,这样就可以将变量数据动态地注入到模板中,形成一个动态的HTML页面。这个页面会随着HttpResponse返回给客户端,在浏览器中显示。DTL还提供了用于条件检查和循环的结构,我们也将对此进行研究。


上下文字典

要开始在Django中使你的页面变得动态,你需要熟悉上下文字典的概念。这是Django中render()函数的第三个参数,是可选的。在context dictionary中会有一些键/值对,这些键/值对会作为变量传递给被渲染的模板。每个键都成为模板中的变量名,你可以通过引用键名来访问模板中的值。下面的片段用一些动态数据来填充上下文变量。

C:\python\djangoprojects\myproject\goals\views.py

from django.shortcuts import redirect, render
from django.http import HttpResponse, HttpResponseRedirect
from django.urls import reverse

# dictionary data store
goals = {
    'daily': 'Learn Something New',
    'weekly': 'Take a day off',
    'monthly': 'Complete a creative course'
}


def homepage(request):
    goal_list = '<html><body><ul>'
    for goal in goals.keys():
        href = reverse('namedurl', args=[goal])
        goal_list += f'<li><a href="{href}">{goal}</a></li>'
    goal_list += '</ul></body></html>'
    return HttpResponse(goal_list)


def goals_by_int_timeframe(request, timeframe):
    timeframes = list(goals.keys())
    redirect_to = timeframes[timeframe - 1]
    named_redirect = reverse('namedurl', args=[redirect_to])
    return HttpResponseRedirect(named_redirect)


def goals_by_timeframe(request, timeframe):
    context = {'goal': goals[timeframe]}
    return render(request, 'goals/goal.html', context=context)

在模板中使用上下文变量

Django模板中的变量是用特殊的语法来引用的,即两个大括号,后面是变量名称,再后面是两个大括号。它看起来像这样。

  • {{变量}}

这不是标准的HTML,但在Django解析和评估模板文件时,会被它发现。当模板引擎找到一个变量时,它会评估该变量并将其替换为上下文中包含的值。变量名称可以是字母数字字符和下划线("_")的任何组合,但不能以下划线开头,也不能是数字。你也不能在变量名中使用空格或标点符号。

在查看有关视图函数的这行代码时。

goals/templates/goals/goal.html

    context = {'goal': goals[timeframe]}

我们应该明白,'目标'现在是一个可以在模板中访问的变量。让我们来试试吧!

<!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>
    <h1>{{ goal }}</h1>
</body>
</html>

结果是,我们现在有动态数据被加载到每个页面视图的模板中。很好!

我们可以在浏览器中查看页面的源代码,注意到那些特定的大括号并不存在。相反,看起来好像页面上的值是硬编码的。这是因为Django在服务器上进行渲染时分析并替换了任何大括号。然后,这将被打包成最终的HTML字符串,与HttpResponse一起发送给网络浏览器。网络浏览器只接收最终的HTML代码标记,因此在查看网络浏览器的页面源代码时,你永远不会看到任何Django模板语言的特定语法。能够注入动态值是Django模板语言的主要特点之一。

<!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>
    <h1>Learn Something New</h1>
</body>
</html>

多于一个变量

Django中的动态网页肯定会使用一个以上的变量。由于上下文字典可以有任意多的键/值对,所以很容易在模板中添加额外的变量值来进行评估。这里我们修改了视图函数和模板,以反映模板的多个动态值。

goals\views.py

def goals_by_timeframe(request, timeframe):
    context = {
        'goal': goals[timeframe],
        'timeframe': timeframe
    }
    return render(request, 'goals/goal.html', context=context)

goals\templates\goals\goal.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>
    <h1>{{ timeframe }} goal</h1>
    <h2>{{ goal }}</h2>
</body>
</html>