post thumbnail

Django desde Cero: Urls Avanzadas

Publicado Por: Carlos Picca, El 02/10/2013


Detalles del Curso:

Dificultad: Novato

Duración: 20 min


Bienvenidos una vez más a Django desde Cero, curso en el cual aprendemos a programar sin conocimiento alguno. En el capítulo anterior, te enseñe como crear forms o formularios con la ayuda de la librería que trae pre-instalada Django. Si eres nuevo en este curso, te recomiendo que le eches un vistazo al capítulo anterior para que te pongas en contexto (Capítulo 5 - Formularios (Forms))

Hoy, vamos a ver como crear urls avanzadas las cuales nos servirán para manejar información a través de nuestras apps.

¡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'),
)

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\d+)/$', 'blog.views.articulo') donde mostramos un solo articulo dependiendo del id que le pasemos en el url. Con (?P\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')),

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'),
)

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) })

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) })

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:

todos-django-urls-avanzadas

Si navegamos hacia http://127.0.0.1:8000/articulos/obtener/2 deberíamos obtener el articulo con el id 2:

obtener-django-urls-avanzadas


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!


¿Te ha gustado esta publicación?

Compártela:

Por Carlos Picca

Conoce más sobre este autor aquí


comments powered by Disqus