如何用Django的模板来渲染HTML

832 阅读3分钟

在本教程中,我们将探讨如何用Django的模板来渲染HTML。Django是用Python编写的,与PHP等的工作方式不同。在PHP中,我们可以将PHP与HTML混合起来输出网页。Django和Python的工作方式有些不同。在Django中,我们使用Django模板语言或DTL模板,将Python和Django生成的动态数据输出到HTML页面。在之前的教程中,我们跳过了使用模板,只是直接从视图函数返回HTTP响应。现在我们要看看如何使用视图函数来渲染模板。


添加一个模板目录

要在我们的项目中开始使用模板,我们首先需要一个地方来放置它们。这将是一个模板目录,它位于项目根目录下。在我们的例子中,项目根目录是外部djangoblog目录。内部的djangoblog目录是我们的根应用程序。现在让我们来创建这个目录。

adding templates directory django

创建HTML文件

在templates目录下,我们将添加两个Html文件。一个是home.html,另一个是about.html。这些将是我们现在渲染的模板,而不是直接从我们的视图函数发回HttpResponse。

html pages in templates

一旦这些文件被创建,我们可以把一些简单的Html标记放进去,就像这样。

templates/home.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>The Home Page</title>
    <h1>Home Page!</h1>
    <h3>Hi there, thanks for visiting the home page!</h3>
</head>
<body>

</body>
</html>

templates/about.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>The About Page</title>
    <h1>About Page!</h1>
    <h3>Here you can learn all kinds of things about Django!</h3>
</head>
<body>

</body>
</html>

更新views.py

在这一步,我们将从视图函数返回HttpResponse对象改为在视图函数中渲染我们的新模板文件。这是当前的views.py文件。

from django.http import HttpResponse


def home(request):
    return HttpResponse('<h1>The Home Page!</h1>')


def about(request):
    return HttpResponse('<h1>About!</h1>')

下面是我们要对views.py进行这些修改的方法。

djangoblog/views.py

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


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


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

在上面views.py的新迭代中,突出显示的几行现在使用[render()]函数。这个函数可以接受三个参数,但在我们的例子中,我们只传递了两个参数。第一个参数是 HTTP 请求本身。第二个参数是要渲染的Html模板。在未来的教程中,我们将研究如何使用第三个参数。第三个参数可以是一个[字典],所以你可以从视图中传递动态数据到模板。

配置模板设置

在我们可以在浏览器中试用之前,我们需要在Django的settings.py文件中配置模板设置。如果我们不采取这一步骤,我们会得到一个类似的错误。

TemplateDoesNotExist at /
home.html

请求方法。GET
Request URL: http://localhost:8000/
Django Version: 3.0.3
Exception Type:TemplateDoesNotExist
异常值。

home.html

因此,让我们打开djangoblog/settings.py,配置一下我们的模板位置。找出这段代码。

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        '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 = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': ['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',
            ],
        },
    },
]

现在我们可以测试一下 **/**和 **/about**路线,看看它们会产生什么结果。

主页
django render html home page

关于页面
django about html page

Django HTML页面总结

这是一些很好的渐进式改进!通过这段代码,我们从视图函数直接向浏览器返回响应,到现在让视图函数渲染一个Html模板以获得更好的结果。