【Django入门】——Django中视图函数和模板文件的使用

【Django入门】——MVC和MVT两种模式的异同中,我们知道:

  • Django中的视图模块主要负责处理浏览器发来的请求。具体的功能实现,需要开发者在应用目录的views.py文件中定义视图函数,然后在应用和项目的urls.py文件中进行相关编码;
  • Django中的模板主要负责生成和返回由浏览器展示的前端文件。具体的功能实现,需要开发者在项目目录下新建模板文件存放的文件夹,接着在项目的settings.py文件中完成配置后创建模板文件。

本文延续了文章【Django入门】——Django后台管理实战简介的示例。

一、视图函数的使用

1. 定义视图函数

首先,需要在views.py文件中定义一个视图函数,该函数必须接受一个HttpRequest类创建的对象,返回一个HttpResponse类创建的对象。

# views.py
from django.shortcuts import render
from django.http import HttpResponse


# Create your views here.
# 1. 定义视图函数
def index(request):  # request是一个HttpRequest对象
    """
    这是一个视图函数,通过和Model以及Template交互用来处理浏览器发来的请求
    """
    return HttpResponse('Hello Python!')

2. 进行URL配置

接着,需要在booktest应用下的urls.py文件中建立URL地址和视图函数之间的关系,具体是通过在名为urlpatterns的列表中通过django.conf.urls中的url()函数创建一个对象。需要注意的是,应用下的urls.py文件需要开发者自己手动创建。

# urls.py
from django.conf.urls import url
from booktest import views


# 2. 进行URL配置,建立URL地址和视图之间的对应关系
urlpatterns = [
    # 通过url函数设置url路由配置项
    url(r'^index', views.index)  # 建立后续通过127.0.0.1:8000/index中的index和视图函数index之间的关系
]

3. 包含应用urls文件

然后,需要在项目test1urls.py文件中包含应用booktest中的urls文件。

from django.conf.urls import url, include
from django.contrib import admin

# 项目的urls文件
# 3. 包含booktest应用中的urls文件
urlpatterns = [
    url(r'^admin/', admin.site.urls),  # 配置项目
    url(r'^', include('booktest.urls')),
]

最后,使用以下命令启动服务器后,在本机浏览器地址栏输入127.0.0.1:8000/index后将看到Hello Python Guru!字样。

python manage.py runserver

4. 程序的执行顺序

当在和启动了Django的本机机器的浏览器地址栏输入127.0.0.1:8000/index后,服务器就会拿着/index向Django发起请求,此时Django框架程序的执行顺序恰和上述流程相反,即:

  • 程序先执行到项目test1urls.py文件,寻找是否有被包含的应用文件;
  • 程序接着转至应用booktesturls.py文件,尝试查找对应的视图函数;
  • 程序最后调用views.py下定义好的视图函数然后返回结果。

实际上,完整的流程如下图所示:

在这里插入图片描述

  1. 去除域名,和参数(?后的内容),以及前面的/,使用剩下的pre_index到项目的urls.py文件进行匹配;
  2. 匹配成功后,去除匹配成功的字符pre_,使用剩下的index至应用的urls.py文件中进行正则匹配;
  3. 匹配成功后调用对应的视图函数,在对应的视图函数中对浏览器发来的请求进行处理,并返回处理结果;
  4. 浏览器收到Django项目返回的请求结果后,将结果渲染后展示给用户。

二、模板文件的使用

1. 创建模板文件夹

如下列文件结构所示,首先,需要在与booktest应用同一级目录下创建一个用于存放模板文件的文件夹templates,接着又在templates下创建了一个名为booktest的目录,这样做的原因在于:一般一个项目中可能存在多个应用,为各个应用在templates目录下创建与应用同名的文件夹可以更好地管理与每个应用对应的模板文件,文件结构也更加清晰。

.
├────── booktest
│   ├────── admin.py
│   ├────── apps.py
│   ├────── __init__.py
│   ├────── migrations
│   │   ├────── ...
│   │   ├────── __init__.py
│   │   └────── ...
│   ├────── models.py
│   ├────── ...
│   ├────── tests.py
│   ├────── urls.py
│   └────── views.py
├────── db.sqlite3
├────── manage.py
├────── templates
│   ├────── booktest
│   └────── __init__.py
└── test1
    ├────── __init__.py
    ├────── ...
    ├────── settings.py
    ├────── urls.py
    └────── wsgi.py

2. 配置模板目录

在新建了和模板相关的目录后,为了让Django框架在后续运行时可以找到模板文件,需要在settings.py文件中完成如# 2处代码所示的配置:

# settings.py

......

import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
# 项目目录的绝对路径
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  # 1

......

TEMPLATES = [
    {
        ......,
        'DIRS': [os.path.join(BASE_DIR, 'templates')],  # 2.设置模板文件目录
        'APP_DIRS': True,
        ......,
    },
]

实际上,在# 2处也可以写上templates文件夹在当前环境下的绝对路径,但是可能产生的问题是:当项目被重新部署后,Django框架按照原先的绝对路径将找不到模板文件。

为了避免该问题,这里使用Python的os模板:

  • 首先,通过# 1处代码获取了当前文件在当前环境下的绝对路径;
  • 其次,通过# 2处代码得到了templates文件夹在当前环境下的绝对路径;
  • 因此,只要保证项目中的各文件位置不变,则无论项目被部署至何处,都不会出现找不到模板文件的问题。

3. 创建模板文件

创建模板文件只需要在templates下的与应用同名文件夹下创建一个HTML文件,然后在其中写入测试代码即可:

<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>template files</title>
</head>
<body>
<h1>This is a template file</h1>
</body>
</html>

4. 使用模板文件

为了让Django框架运行时可以使用模板文件,需要通过下列几个步骤:

  • 加载模板文件;
  • 定义模板上下文;
  • 模板文件渲染。
from django.http import HttpResponse
from django.template import loader, RequestContext


# Create your views here.
def index(request):  # request是一个HttpRequest对象
    """
    这是一个视图函数,通过和Model以及Template交互用来处理浏览器发来的请求
    """

    # 使用模板文件
    # 1. 加载模板文件
    template_obj = loader.get_template('booktest/index.html')
    # 2. 定义模板上下文:为模板文件传递数据
    context = {}  # 向模板文件传递数据是通过字典实现的,此处还未传数据,因为为空字典
    # 3. 模板文件渲染,产生标准的HTML内容
    res_html = template_obj.render(context)
    # 4. 返回结果给浏览器
    return HttpResponse(res_html)

使用以下命令启动服务器后,在本机浏览器地址栏输入127.0.0.1:8000/index后将看到一号标题大小的下列字样。

python manage.py runserver

This is a template file

4.1 自定义函数使用模板文件

实际上,在views.py文件中会有多个视图函数,而每个视图函数在使用模板文件时都需要经过加载模板文件、定义模板上下文、模板文件渲染这三个步骤,因此可以考虑为此定义一个函数:

from django.http import HttpResponse
from django.template import loader


def self_render(request, template_path, context_dict=None):
    """自定义函数使用模板文件"""
    # 1. 加载模板文件
    template_obj = loader.get_template(template_path)

    # 2. 定义模板上下文:为模板文件传递数据
    if context_dict is None:
        context_dict = {}
    context = context_dict

    # 3. 模板文件渲染,产生标准的HTML内容
    res_html = template_obj.render(context)

    # 4. 返回结果给浏览器
    return HttpResponse(res_html)


# Create your views here.
def index(request):  # request是一个HttpRequest对象
    """
    这是一个视图函数,通过和Model以及Template交互用来处理浏览器发来的请求
    """
    return self_render(request, 'booktest/index.html')

4.2 通过框架函数使用模板文件

实际上,上述方式只是为了演示用,因为Django框架已经定义了一个用于实现上述功能的render()函数,开发者只需直接调用即可:

from django.shortcuts import render


# Create your views here.
def index(request):  # request是一个HttpRequest对象
    """
    这是一个视图函数,通过和Model以及Template交互用来处理浏览器发来的请求
    """
    return render(request, 'booktest/index.html')

5. 使用模板参数

实际上,Django中的模板文件并非一定都是静态的HTML文件,这些模板文件中可能会存在一系列模板变量代码段,从而使得模板文件可以根据传入的参数不同,达到同一个模板文件可以显示变化信息的目的。

在模板文件中:

  • 定义模板变量的语法格式为{{var_name}}
  • 使用模板代码段需要用{%code snippet%}格式。

而模板变量和代码段中变量的实参值可通过views.py文件中render()函数的context变量以字典形式传入。

以下代码演示了如何在模板文件中使用模板变量和代码段:

<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>template files</title>
</head>
<body>

<h1>This is a template file</h1>
1.这里演示了如何使用模板变量:<br/>
{{content}}<br/>
2.这里演示了如何使用列表:<br/>
{{list}}<br/>
3.这里演示了如何使用Django模板文件支持的遍历语法:<br/>
    {%for i in list%}
        <li>{{i}}</li>
    {%endfor%}
</body>
</html>

以下代码演示了如何在views.py文件中实现向模板文件的变量传递参数:

# views.py
from django.shortcuts import render


# Create your views here.
def index(request):  # request是一个HttpRequest对象
    """
    这是一个视图函数,通过和Model以及Template交互用来处理浏览器发来的请求
    """
    return render(request=request,
                  template_name='booktest/index.html',
                  context={'content': 'Hello, Python Guru!',
                           'list': list(range(1, 10))
                           }
                  )

最后,在本机浏览器地址栏输入127.0.0.1:8000/index后将看到下列信息:

This is a template file

1.这里演示了如何使用模板变量:
Hello, Python Guru!
2.这里演示了如何使用列表:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
3.这里演示了如何使用Django模板文件支持的遍历语法:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

至此,本文和【Django入门】——Django中通过模型类实现数据表基本操作已经通过示例将Django框架的M(模型)、V(视图)和T(模板)三个模块做了简单的介绍。

猜你喜欢

转载自blog.csdn.net/weixin_37780776/article/details/107396669