English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Mapeo de URL en Django

现在,我们有一个工作视图在前面的章节中解释。我们希望通过一个URL来访问该视图。 Django有他自己 URL映射的方式,现在我们来编辑项目中的 url.py 文件(myproject/url.py)完成。url.py 文件内容看起来如下:

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : es.oldtoolbag.com
# Date : 2020-08-08
from django.conf.urls import patterns, include, url
 from django.contrib import admin
 admin.autodiscover()}
 urlpatterns = patterns('',
    #Ejemplos
    #url(r'^, 'myproject.view.home', name = 'home'),
    #url(r'^blog/', include('blog.urls')),
    url(r'^admin', include(admin.site.urls)),
 ) , 'myproject.view.home', name = 'home'),
    #url(r'^blog/', include('blog.urls')),
    url(r'^admin', include(admin.site.urls)),
 )

当用户在您的网络应用程序发起一个网页的请求,Django控制器会接管通过url.py文件来寻找相应的视图,然后返回HTML响应或如果没有找到则返回404未找到错误。最重要的是“urlpatterns” 元组。这就是定义URL和视图之间的映射。一个映射的URL模式就像一个元组 −

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : es.oldtoolbag.com
# Date : 2020-08-08
from django.conf.urls import patterns, include, url
 from django.contrib import admin
 admin.autodiscover()}
 urlpatterns = patterns('',
    #Ejemplos
    #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'),
 ) , '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模式的命名来执行上面示例。这样做以后,启动服务器,通过以下URL访问您的视图:http://127.0.0.1/hello

整理网址

到目前为止,我们已经创建了“myprojects/url.py”文件的URL,然而,正如前面关于Django说明,创建一个应用程序,最好是能够重复使用在不同的项目中应用。 这样就可以很容易地看到的问题是什么,如果要保存所有网址中在“projecturl.py”文件中。 所以,最好的做法是创建每个应用程序的“url.py”,并把它列入我们的主项目 url.py 文件(包括在我们的管理界面管理的 URL 之前)。

它是如何做的呢?

我们需要使用下面的代码来创建一个 urls.py 文件在 myapp 文件夹中(myapp/urls.py) −

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : es.oldtoolbag.com
# Date : 2020-08-08
from django.conf.urls import patterns, include, url
 urlpatterns = patterns('', url(r'^hello/', myapp.views.hello, name = 'hello'),)

myproject/urls.py 将变更为以下-

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : es.oldtoolbag.com
# Date : 2020-08-08
from django.conf.urls import patterns, include, url
 from django.contrib import admin
 admin.autodiscover()}
 urlpatterns = patterns('',
    #Ejemplos
    #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)),
 ) , 'myproject.view.home', name = 'home'),
    #url(r'^blog/', include('blog.urls')),
    url(r'^admin', include(admin.site.urls)),
    url(r'^myapp/', include(myapp.urls)),
 )

Hemos incluido todas las URL de la aplicación myapp. Esto se hace a través de la visita a home.html para "/hello", ahora es "/myapp/hello", es una estructura mejor y más fácil de entender para la aplicación web.

Vamos a crear un archivo de vista: C:\myproject\templates\myapp\hello.html, con el siguiente contenido:

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : es.oldtoolbag.com
# Date : 2020-08-08
<html>
 <head>
   <meta http-equiv="content-type="content="text/html; charset=utf-8>
   <title>Hello </title>
   <meta name="robots" content="NONE,NOARCHIVE">
   </style>
 </head>
     <body>
         <h2>Welcome to w3codebox .</h2>
         <p>This is my first Django App</p>
     <body>
 </html>

Ahora imaginemos que en otro vista 'morning' de myapp, queremos que se mapee en myapp/url.py, luego cambiaremos nuestra myapp/url.py a −

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : es.oldtoolbag.com
# Date : 2020-08-08
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'),
 )

Esto se puede重构为 -

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : es.oldtoolbag.com
# Date : 2020-08-08
from django.conf.urls import patterns, include, url
 urlpatterns = patterns('myapp.views',
    url(r'^hello/', 'hello', name = 'hello'),
    url(r'^morning/', 'morning', name = 'morning'),)

Como puedes ver, ahora usamos el primer elemento del tupla urlpatterns. Es muy útil cuando quieres cambiar el nombre de la aplicación.

Enviar parámetros a la vista}}

Ahora que sabemos cómo mapear URL, cómo organizarlas, ahora veamos cómo pasar parámetros a las vistas. Un ejemplo clásico de artículo (el artículo que desea visitar "/articles/article_id))。

Los parámetros se pasan mediante la captura de expresiones regulares de patrones de URL. Si tenemos una vista como la siguiente "myapp/view.py

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : es.oldtoolbag.com
# Date : 2020-08-08
from django.shortcuts import render
 from django.http import HttpResponse
 def hello(request):
    return render(request, "hello.html", {})
 def viewArticle(request, articleId):
    text = "Mostrando artículo número: %s"%articleId
    return HttpResponse(text)

Queremos mapearlo en myapp/urls.py, por lo que podemos hacerlo a través de "/myapp/article/articleId” acceso, necesitamos en el siguiente "myapp/urls.py Definición -

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : es.oldtoolbag.com
# Date : 2020-08-08
from django.conf.urls import url
 from . import views
 urlpatterns = [
     url(r'^hello', views.hello, name='hello'),
     url(r'^article/(\d+)/', views.viewArticle, name='article'), 
     url(r'^', views.index, name='index'),
 ], views.index, name='index'),
 ]


Cuando Django ve la URL: "/myapp/article/42",que pasará los parámetros42Llegando a la vista viewArticle, en el navegador, deberíamos obtener el siguiente resultado -

Atención, el orden de los parámetros aquí es muy importante. Supongamos que queremos ver la lista de artículos de un mes específico de un año determinado, ahora agregamos una vista de viewArticles. El código de view.py se convierte en -

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : es.oldtoolbag.com
# Date : 2020-08-08
from django.shortcuts import render
 from django.http import HttpResponse
 def hello(request):
    return render(request, "hello.html", {})
 def viewArticle(request, articleId):
    text = "Mostrando artículo número: %s"%articleId
    return HttpResponse(text)
 def viewArticles(request, mes, year):
    text = "Mostrando artículos de: %s"/%s"%(year, mes)
    return HttpResponse(text)

correspondiente a myapp/urls.py archivo parece así −

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : es.oldtoolbag.com
# Date : 2020-08-08
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'),)

Ahora, cuando acceda a http://localhost:8000/myapp/articles/12/2015/,obtendrá 'Mostrando artículos de: 2015/12,pero si se convierten los parámetros, no se obtendrá el mismo resultado.

Para evitar este problema, es posible que un parámetro de URL se enlaze con un parámetro de vista. Por lo tanto, url.py se convertirá -

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : es.oldtoolbag.com
# Date : 2020-08-08
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'),)