- Django 教程
- 姜戈 - 主页
- Django - 基础知识
- Django - 概述
- Django - 环境
- Django - 创建项目
- Django - 应用程序生命周期
- Django - 管理界面
- Django - 创建视图
- Django - URL 映射
- Django - 模板系统
- Django - 模型
- Django - 页面重定向
- Django - 发送电子邮件
- Django - 通用视图
- Django - 表单处理
- Django - 文件上传
- Django - Apache 设置
- Django - Cookie 处理
- Django - 会话
- Django - 缓存
- Django - 评论
- 姜戈 - RSS
- Django - AJAX
- Django 有用资源
- Django - 快速指南
- Django - 有用的资源
- Django - 讨论
Django - URL 映射
现在我们已经有了前面章节中所解释的工作视图。我们希望通过 URL 访问该视图。Django 有自己的 URL 映射方式,它是通过编辑项目 url.py 文件(myproject/url.py)来完成的。url.py 文件看起来像 -
from django.conf.urls import patterns, include, url from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', #Examples #url(r'^$', 'myproject.view.home', name = 'home'), #url(r'^blog/', include('blog.urls')), url(r'^admin', include(admin.site.urls)), )
当用户对 Web 应用程序上的页面发出请求时,Django 控制器将接管并通过 url.py 文件查找相应的视图,然后返回 HTML 响应,如果未找到,则返回 404 未找到错误。在 url.py 中,最重要的是“urlpatterns”元组。您可以在其中定义 URL 和视图之间的映射。映射是 URL 模式中的元组,例如 -
from django.conf.urls import patterns, include, url from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', #Examples #url(r'^$', 'myproject.view.home', name = 'home'), #url(r'^blog/', include('blog.urls')), url(r'^admin', include(admin.site.urls)), url(r'^hello/', 'myapp.views.hello', name = 'hello'), )
标记的行将 URL“/home”映射到 myapp/view.py 文件中创建的 hello 视图。正如您在上面看到的,映射由三个元素组成 -
模式- 与您想要解析和映射的 URL 匹配的正则表达式。所有可以与 python 're' 模块一起使用的东西都符合该模式(当你想通过 url 传递参数时很有用)。
视图的 python 路径- 与导入模块时相同。
名称- 为了执行 URL 反转,您需要使用命名 URL 模式,如上面的示例所示。完成后,只需启动服务器即可通过以下方式访问您的视图:http://127.0.0.1/hello
组织您的 URL
到目前为止,我们已经在“myprojects/url.py”文件中创建了 URL,但是正如前面关于 Django 和创建应用程序所述,最好的一点是能够在不同的项目中重用应用程序。如果您将所有 URL 保存在“projecturl.py”文件中,您可以轻松看出问题所在。因此,最佳实践是为每个应用程序创建一个“url.py”,并将其包含在我们的主项目 url.py 文件中(我们之前包含了管理界面的管理 URL)。
它是如何完成的?
我们需要使用以下代码在 myapp 中创建一个 url.py 文件 -
from django.conf.urls import patterns, include, url urlpatterns = patterns('', url(r'^hello/', 'myapp.views.hello', name = 'hello'),)
然后 myproject/url.py 将更改为以下内容 -
from django.conf.urls import patterns, include, url from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', #Examples #url(r'^$', 'myproject.view.home', name = 'home'), #url(r'^blog/', include('blog.urls')), url(r'^admin', include(admin.site.urls)), url(r'^myapp/', include('myapp.urls')), )
我们已包含 myapp 应用程序中的所有 URL。通过“/hello”访问的 home.html 现在是“/myapp/hello”,对于 Web 应用程序来说,这是一个更好、更容易理解的结构。
现在假设我们在 myapp “morning” 中有另一个视图,我们想将其映射到 myapp/url.py 中,然后我们将 myapp/url.py 更改为 -
from django.conf.urls import patterns, include, url urlpatterns = patterns('', url(r'^hello/', 'myapp.views.hello', name = 'hello'), url(r'^morning/', 'myapp.views.morning', name = 'morning'), )
这可以重构为 -
from django.conf.urls import patterns, include, url urlpatterns = patterns('myapp.views', url(r'^hello/', 'hello', name = 'hello'), url(r'^morning/', 'morning', name = 'morning'),)
正如您所看到的,我们现在使用urlpatterns元组的第一个元素。当您想要更改应用程序名称时,这会很有用。
将参数发送到视图
我们现在知道如何映射 URL,如何组织它们,现在让我们看看如何将参数发送到视图。一个经典的示例是文章示例(您希望通过“/articles/article_id”访问文章)。
传递参数是通过使用URL 模式中的正则表达式捕获它们来完成的。如果我们在“myapp/view.py”中有如下视图
from django.shortcuts import render from django.http import HttpResponse def hello(request): return render(request, "hello.html", {}) def viewArticle(request, articleId): text = "Displaying article Number : %s"%articleId return HttpResponse(text)
我们希望将其映射到 myapp/url.py 中,以便我们可以通过“/myapp/article/articleId”访问它,我们需要在“myapp/url.py”中添加以下内容 -
from django.conf.urls import patterns, include, url urlpatterns = patterns('myapp.views', url(r'^hello/', 'hello', name = 'hello'), url(r'^morning/', 'morning', name = 'morning'), url(r'^article/(\d+)/', 'viewArticle', name = 'article'),)
当 Django 看到 url:“/myapp/article/42”时,它会将参数“42”传递给 viewArticle 视图,在浏览器中您应该得到以下结果 -
请注意,参数的顺序在这里很重要。假设我们想要一年中一个月的文章列表,让我们添加一个 viewArticles 视图。我们的 view.py 变成 -
from django.shortcuts import render from django.http import HttpResponse def hello(request): return render(request, "hello.html", {}) def viewArticle(request, articleId): text = "Displaying article Number : %s"%articleId return HttpResponse(text) def viewArticle(request, month, year): text = "Displaying articles of : %s/%s"%(year, month) return HttpResponse(text)
相应的url.py文件将如下所示 -
from django.conf.urls import patterns, include, url urlpatterns = patterns('myapp.views', url(r'^hello/', 'hello', name = 'hello'), url(r'^morning/', 'morning', name = 'morning'), url(r'^article/(\d+)/', 'viewArticle', name = 'article'), url(r'^articles/(\d{2})/(\d{4})', 'viewArticles', name = 'articles'),)
现在,当您转到“/myapp/articles/12/2006/”时,您将得到“显示文章:2006/12”,但如果反转参数,您将不会得到相同的结果。
为了避免这种情况,可以将 URL 参数链接到视图参数。为此,我们的url.py将变成 -
from django.conf.urls import patterns, include, url urlpatterns = patterns('myapp.views', url(r'^hello/', 'hello', name = 'hello'), url(r'^morning/', 'morning', name = 'morning'), url(r'^article/(\d+)/', 'viewArticle', name = 'article'), url(r'^articles/(?P\d{2})/(?P\d{4})', 'viewArticles', name = 'articles'),)