¡Alerta!
Todos los ejemplos usados en el tutorial de son una continuación de los ejemplos del capitulo anterior.
¿Porque usar urls avanzadas?
Las url avanzadas nos permiten mantener un mayor control de las direcciones que pueden o no usar nuestras aplicaciones.
¿Cómo definimos urls avanzadas dentro de nuestras apps?
Lo primero que tenemos que hacer es definir un archivo llamado urls.py
dentro de nuestra app, en nuestro caso blog.
Una vez que creemos ese archivo debemos agregarle lo siguiente:
from django.conf.urls import patterns, include, url urlpatterns = patterns('', url(r'^todos/$', 'blog.views.articulos'), url(r'^obtener/(?P<articulo_id>\d+)/$', 'blog.views.articulo'), )123456 from djangoconfurls import patterns,include,url urlpatterns=patterns('', url(r'^todos/$','blog.views.articulos'), url(r'^obtener/(?P<articulo_id>\d+)/$','blog.views.articulo'),)
Observemos que prácticamente estamos recreando el archivo
urls.py
general de nuestro sitio web, pero ahora lo vamos a adaptar para que solo maneje lo que tiene que ver con nuestra app blog, para que así si tenemos muchas aplicaciones no nos confundamos a la hora de generar el contenido.Como se puede ver hemos definido dos direcciones la primera
url(r'^todos/$', 'blog.views.articulos')
la cual nos va a llevar a la vista donde despleguemos todos los artículos y la segundaurl(r'^obtener/(?P<articulo_id>\d+)/$', 'blog.views.articulo')
donde mostramos un solo articulo dependiendo del id que le pasemos en el url. Con(?P<articulo_id>\d+)
estamos permitiendo a Django obtener el id del articulo que esta escrito en la dirección como tal.Cabe destacar que puedes generar direcciones con el nombre que tu desees y redireccionarlas a la vista que tu prefieras. Todo depende de lo que tu sitio web necesite.
Lo segundo que tenemos que hacer es decirle al archivo general urls.py
que viene con nuestro site que hemos generado un archivo urls.py
solo para el manejo de artículos. Veamos como hacerlo:
En el archivo urls.py
de nuestro sitio, en nuestro caso PrimerBlog agregamos lo siguiente:
1 (r'^articulos/',include('blog.urls')),
Al archivo debería lucir así:
from django.conf.urls import patterns, include, url # Uncomment the next two lines to enable the admin: from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', (r'^articulos/', include('blog.urls')), # Examples: # url(r'^$', 'PrimerBlog.views.home', name='home'), # url(r'^PrimerBlog/', include('PrimerBlog.foo.urls')), url(r'^$', 'blog.views.home', name='home'), # Uncomment the admin/doc line below to enable admin documentation: url(r'^admin/doc/', include('django.contrib.admindocs.urls')), # Uncomment the next line to enable the admin: url(r'^admin/', include(admin.site.urls)), url(r'^crear/', 'blog.views.crear', name='crear'), )12345678910111213141516171819202122 from djangoconfurls import patterns,include,url # Uncomment the next two lines to enable the admin:from djangocontrib import adminadminautodiscover() urlpatterns=patterns('', (r'^articulos/',include('blog.urls')), # Examples: # url(r'^$', 'PrimerBlog.views.home', name='home'), # url(r'^PrimerBlog/', include('PrimerBlog.foo.urls')), url(r'^$','blog.views.home',name='home'), # Uncomment the admin/doc line below to enable admin documentation: url(r'^admin/doc/',include('django.contrib.admindocs.urls')), # Uncomment the next line to enable the admin: url(r'^admin/',include(adminsiteurls)), url(r'^crear/','blog.views.crear',name='crear'),)
Observemos que lo que estamos haciendo acá es mapear todo el contenido que venga por
articulos/
dentro de la url hacia el archivourls.py
que creamos anteriormente el cual maneja obtener y todos.
Lo tercero y último que tenemos que hacer es crear las vistas que nos permitan manejar estas direcciones que creamos anteriormente. Para esto nos vamos al archivo views.py
dentro de nuestra app blog y agregamos el siguiente código:
12345 def articulos(request): returnrender_to_response('index.html',{'articulos':Articuloobjectsall()}) def articulo(request,articulo_id=1): returnrender_to_response('articulo.html',{'articulo':Articuloobjectsget(id=articulo_id)})
Observemos que creamos una vista llamada
articulos
la cual va a obtener todos los artículos disponibles en la base de datos y desplegarla en el templateindex.html
una vez que accedamos a la dirección todos que creamos anteriormente, y segundo creamos una vista denominadaarticulo
la cual va a obtener solo el artículo con el id que le pasemos enarticulo_id
una vez accedamos a la dirección obtener/.
El archivo views.py
debería lucir así:
123456789101112131415161718192021222324252627282930313233 from djangoshortcuts import render_to_responsefrom blogmodels import Articulofrom forms import ArticuloFormfrom djangohttp import HttpResponseRedirectfrom djangocorecontext_processors import csrf def home(request): entradas=Articuloobjectsall()[:10] returnrender_to_response('index.html',{'articulos':entradas}) def crear(request): ifrequestPOST: form=ArticuloForm(requestPOST) ifformis_valid(): formsave() returnHttpResponseRedirect('/') else: form=ArticuloForm() args={} argsupdate(csrf(request)) args['form']=form returnrender_to_response('crear_articulo.html',args) def articulos(request): returnrender_to_response('index.html',{'articulos':Articuloobjectsall()}) def articulo(request,articulo_id=1): returnrender_to_response('articulo.html',{'articulo':Articuloobjectsget(id=articulo_id)})
Probemos
La manera para probar si nuestras urls son correctas es navegando hacia esas direcciones.
Si navegamos hacia http://127.0.0.1:8000/articulos/todos/ deberíamos obtener:
Si navegamos hacia http://127.0.0.1:8000/articulos/obtener/2 deberíamos obtener el articulo con el id 2:
Conclusión
En esta lección, aprendimos como crear urls avanzandas las cuales nos servirán para manejar información a través de nuestras apps. Si tienes alguna pregunta, yo estaré feliz de responderte en los comentarios, además espero que te unas y le eches un vistazo a todo el resto de este curso.
¡Te espero la próxima semana!