📜  Django-URL映射

📅  最后修改于: 2020-10-25 09:59:50             🧑  作者: Mango


现在,我们已经有了前面各章中解释的工作视图。我们想通过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 ‘模块一起使用的所有内容都适用于该模式(当您想通过url传递参数时很有用)。

  • 视图的Python路径-与导入模块时相同。

  • 名称-为了执行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“早晨”中有另一个视图,并且想要将其映射到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,如何组织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'),)