目录

Django - URL映射( URL Mapping)

现在我们已经有了前面章节中解释的工作视图。 我们想通过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视图。 如上所示,映射由三个元素组成 -

  • The pattern - 匹配您要解析的URL和映射的正则表达式。 可以使用python're'模块的所有内容都符合该模式(当您想通过url传递参数时非常有用)。

  • The python path to the view - 与导入模块时相同。

  • The name - 为了执行URL反转,您需要使用命名URL模式,如上面的示例所示。 完成后,只需启动服务器即可访问您的视图:http://127.0.0.1/hello

整理您的网址

到目前为止,我们已经在“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模式中的正则regexp捕获它们来完成的。 如果我们在“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视图,在浏览器中你应该得到以下结果 -

将参数传递给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参数链接到view参数。 为此,我们的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'),)
↑回到顶部↑
WIKI教程 @2018