步骤 2:使用视图和页面模板创建 Django 应用

适用范围:yesVisual Studio noVisual Studio for Mac noVisual Studio Code

在 Visual Studio 项目中,你现在所拥有的只是 Django 项目的网站级组件,这些组件可以运行一个或多个 Django 应用。 下一步是在单个页面中创建你的第一个应用。

在此步骤中,你将了解如何:

步骤 2-1:创建具有默认结构的应用

www.contoso.com

Django 应用通常以一组标准文件开始。 Visual Studio 提供模板来初始化 Django 项目中的 Django 应用,并提供起到相同作用的集成菜单命令:

  • 模板:在“解决方案资源管理器”中,右键单击项目,然后选择“添加”>“新项” 。 在“添加新项”对话框中,选择“Django 1.9 应用”模板,在“名称”字段中指定应用名称,并选择“确定”。

解决方案资源管理器的屏幕截图。

“添加新项”窗口的屏幕截图。

  • 集成的命令:在“解决方案资源管理器”中,右键单击项目,然后选择“添加”>“Django 应用” 。 此命令将提示你输入一个名称。 在“新应用名称”字段中指定应用名称,然后选择“确定”。

    添加 Django 应用的菜单命令。

    输入 Django 应用名称的菜单命令。

使用任一方法创建一个名为“HelloDjangoApp”的应用。 现在,系统将在你的项目中创建“HelloDjangoApp”文件夹。 此文件夹包含以下项:

解决方案资源管理器中的 Django 应用文件。

{{ content }}from django.contrib import adminfrom django.db import modelsfrom django.shortcuts import render

使用名称“HelloDjangoApp”时,apps.py 文件的内容如下所示:

from django.apps import AppConfig

class HelloDjangoAppConfig(AppConfig):
    name = 'HelloDjango'

问:在 Visual Studio 中创建 Django 应用与在命令行上创建应用有什么不同吗?

manage.py startapp 

步骤 2-2:从 Django 项目运行应用

此时,如果再次在 Visual Studio 中运行项目(使用工具栏按钮或”调试”>“启动调试”),仍会看到默认页。 不会显示应用内容,因为需要定义一个特定于应用的页面,并将该应用添加到 Django 项目中:

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

def index(request):
    return HttpResponse("Hello, Django!")
from django.conf.urls import include, url
import HelloDjangoApp.views

# Django processes URL patterns in the order they appear in the array
urlpatterns = [
    url(r'^$', HelloDjangoApp.views.index, name='index'),
    url(r'^home$', HelloDjangoApp.views.index, name='home'),
]

提交到源代码管理

对代码进行更改并成功测试后,可以审阅并提交到源代码管理。 在后续步骤中,当本教程提醒你再次提交到源代码管理时,可以参阅此部分。

  1. 在 Visual Studio 底部选择“更改”按钮(下面的圆圈),可以导航到“团队资源管理器”。

    Visual Studio 状态栏上的源代码管理更改按钮。

  2. 在“团队资源管理器” 中,输入提交消息,如“创建初始 Django 应用”并选择“全部提交” 。 提交完成后,将看到一条消息“提交已在本地创建的 <哈希>。同步后与服务器共享你的更改。”如果要将更改推送到远程存储库,请选择“同步”,然后选择“传出提交”下的“推送”。 在推送至远程存储库之前,还可以累积多个本地提交。

    将提交推送到团队资源管理器中的远程存储库。

问:路由字符串前的“r”前缀代表什么?

答:Python 中字符串的“r”前缀表示“raw”,它指示 Python 不转义字符串中的任何字符。 正则表达式使用许多特殊字符。 相比转义字符“\”,使用“r”前缀可以使这些字符串更易于读取。

问:在 URL 路由条目中,^ 和 $ 字符表示什么意思?

https://www.domain.com/^$https://www.domain.com/^home$https://www.domain.com/home/
^home

若要尝试使用不同的正则表达式,请尝试使用联机工具,如 pythex.org 中的 regex101.com。

步骤 2-3:使用 HTML 呈现视图

index
HttpResponseindexfromindex
from datetime import datetime

def index(request):
    now = datetime.now()

    html_content = "<html><head><title>Hello, Django</title></head><body>"
    html_content += "<strong>Hello Django!</strong> on " + now.strftime("%A, %d %B, %Y at %X")
    html_content += "</body></html>"

    return HttpResponse(html_content)

现在,再次运行该项目并查看类似于“Hello Django! 2018 年 4 月 16 日(星期一) 16:28:10”的消息。 刷新页面以更新时间并确认通过每个请求生成了内容。 完成后,请停止服务器。

步骤 2-4:使用页面模板呈现视图

now.strftime
{{}}{{ content }}

下面的步骤演示了如何使用页面模板:

INSTALLED_APPS = [
    'HelloDjangoApp',
    # Other entries...
]
'APP_DIRS': True,
<html>
<head><title></title></head>

<body>

{{ content }}

</body>
</html>
from django.shortcuts import render   # Added for this step

def index(request):
    now = datetime.now()

    return render(
        request,
        "HelloDjangoApp/index.html",  # Relative path from the 'templates' folder to the template file
        # "index.html", # Use this code for VS 2017 15.7 and earlier
        {
            'content': "<strong>Hello Django!</strong> on " + now.strftime("%A, %d %B, %Y at %X")
        }
    )
<html>
    <head>
        <title>{{ title }}</title>
    </head>
    <body>
        <strong>{{ message }}</strong>{{ content }}
    </body>
</html>
def index(request):
    now = datetime.now()

    return render(
        request,
        "HelloDjangoApp/index.html",  # Relative path from the 'templates' folder to the template file
        # "index.html", # Use this code for VS 2017 15.7 and earlier
        {
            'title' : "Hello Django",
            'message' : "Hello Django!",
            'content' : " on " + now.strftime("%A, %d %B, %Y at %X")
        }
    )

问:页面模板必须在一个单独的文件中吗?

答:通常,模板会保留在单独的 HTML 文件中。 你也可以使用内联模板。 建议使用单独的文件使标记和代码完全分离。

问:模板必须使用 .html 文件扩展名吗?

render
{##}

问:我在运行项目时,看到了一个找不到模板的错误。 为什么会这样?

INSTALLED_APPS

问:为什么模板命名空间如此重要?

render

后续步骤

深入了解