开发手册 欢迎您!
软件开发者资料库

Django - URL映射

Django URL Mapping - 从基础知识,概述,环境,创建项目,应用程序生命周期,管理界面,创建视图,URL映射,模板系统,模型,页面重定向,发送电子邮件,通用视图,表单处理,文件上传,Apache设置,Cookie处理,会话,缓存,评论,RSS,AJAX。

现在我们已经有了前面章节中解释的工作视图.我们想通过URL访问该视图. Django有自己的URL映射方式,它是通过编辑你的项目url.py文件(myproject/url.py)来完成的. url.py文件看起来像 :

from django.conf.urls import patterns, include, urlfrom django.contrib import adminadmin.autodiscover()urlpatterns = patterns('',   #Examples   #url(r'^$', 'myproject.view.home', name = 'home'),   #url(r'^blog/', include('blog.urls')),   url(r'^admin', include(admin.site.urls)),)

当用户在您的网络应用程序上请求页面时,Django控制器需要通过url.py文件查找相应的视图,然后返回HTML响应或404未找到错误,如果找不到.在url.py中,最重要的是"urlpatterns"元组.您可以在此处定义URL和视图之间的映射.映射是URL模式中的元组,如 :

from django.conf.urls import patterns, include, urlfrom django.contrib import adminadmin.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

整理您的网址

到目前为止,我们已经在"myprojects/url.py"文件中创建了URL,但是如前所述关于Django和创建应用程序,最好的一点是能够重用不同的应用程序项目.如果要将所有URL保存在"projecturl.py"文件中,则可以轻松查看问题所在.因此,最佳做法是为每个应用程序创建一个"url.py"并将其包含在我们的主项目url.py文件中(我们之前包含管理界面的管理URL).

组织网址

它是如何完成的?

我们需要创建一个网址. myapp中的py文件使用以下代码 :

from django.conf.urls import patterns, include, urlurlpatterns = patterns('', url(r'^hello/', 'myapp.views.hello', name = 'hello'),)

然后myproject/url.py将更改为以下 :

from django.conf.urls import patterns, include, urlfrom django.contrib import adminadmin.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应用程序结构.

Myproject

现在让我们假设我们在myapp"morning"中有另一个视图,我们想在myapp/url.py中映射它,然后我们会将我们的myapp/url.py更改为 :

from django.conf.urls import patterns, include, urlurlpatterns = patterns('',   url(r'^hello/', 'myapp.views.hello', name = 'hello'),   url(r'^morning/', 'myapp.views.morning', name = 'morning'),)

这可以重新计算到 :

from django.conf.urls import patterns, include, urlurlpatterns = patterns('myapp.views',   url(r'^hello/', 'hello', name = 'hello'),   url(r'^morning/', 'morning', name = 'morning'),)

如你所见,我们现在使用 urlpatterns 元组.当您想要更改应用名称时,此功能非常有用.

网址模式

向视图发送参数

我们现在知道如何映射URL,如何组织它们,现在让我们看看如何将参数发送到视图.一个经典示例是文章示例(您想通过"/articles/article_id"访问文章).

通过使用 regexp 在URL模式中.如果我们在"myapp/view.py"中有一个类似下面的视图

from django.shortcuts import renderfrom django.http import HttpResponsedef 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, urlurlpatterns = patterns('myapp.views',   url(r'^hello/', 'hello', name = 'hello'),   url(r'^morning/', 'morning', name = 'morning'),   url(r'^article/(\d+)/', 'viewArticle', name = 'article'),)

当Django看到网址时:/myapp/article/42"它会将参数'42'传递给viewArticle视图,在浏览器中你应该得到以下结果 :

将参数传递给viewArticle

请注意,参数的顺序在这里很重要.假设我们想要一年中一个月的文章列表,让我们添加一个viewArticles视图.我们的view.py变为 :

from django.shortcuts import renderfrom django.http import HttpResponsedef 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, urlurlpatterns = 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',但如果你反转参数,你将得不到相同的结果.

Displaying Articles

为避免这种情况,可以将URL参数链接到view参数.为此,我们的 url.py 将成为 :

from django.conf.urls import patterns, include, urlurlpatterns = 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'),)
t({ id: "Jzndc69N7BtnPgpT", ck: "Jzndc69N7BtnPgpT" })