Revista Informática

Django desde Cero: Urls Avanzadas

Publicado el 02 octubre 2013 por Codehero @codeheroblog

¡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 segunda url(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:

(r'^articulos/', include('blog.urls')),

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 archivo urls.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:

def articulos(request): return render_to_response('index.html', {'articulos' : Articulo.objects.all() }) def articulo(request, articulo_id=1): return render_to_response('articulo.html', {'articulo' : Articulo.objects.get(id=articulo_id) })

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 template index.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 en articulo_id una vez accedamos a la dirección obtener/.

El archivo views.py debería lucir así:

from django.shortcuts import render_to_response from blog.models import Articulo from forms import ArticuloForm from django.http import HttpResponseRedirect from django.core.context_processors import csrf def home(request): entradas = Articulo.objects.all()[:10] return render_to_response('index.html', {'articulos' : entradas}) def crear(request): if request.POST: form = ArticuloForm(request.POST) if form.is_valid(): form.save() return HttpResponseRedirect('/') else: form = ArticuloForm() args = {} args.update(csrf(request)) args['form'] = form return render_to_response('crear_articulo.html', args) def articulos(request): return render_to_response('index.html', {'articulos' : Articulo.objects.all() }) def articulo(request, articulo_id=1): return render_to_response('articulo.html', {'articulo' : Articulo.objects.get(id=articulo_id) })

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!


Volver a la Portada de Logo Paperblog