Foros del Web » Programando para Internet » Python »

Imprimir una vista sin el parametro request

Estas en el tema de Imprimir una vista sin el parametro request en el foro de Python en Foros del Web. Hola amigos de FW, estoy acá mirando la forma de crear un "sidebar" con las categorías y ultimas entradas para un blog personal. Tengo: base.html, ...
  #1 (permalink)  
Antiguo 15/10/2012, 01:49
 
Fecha de Ingreso: octubre-2012
Ubicación: Trujillo
Mensajes: 29
Antigüedad: 11 años, 6 meses
Puntos: 6
Imprimir una vista sin el parametro request

Hola amigos de FW, estoy acá mirando la forma de crear un "sidebar" con las categorías y ultimas entradas para un blog personal.

Tengo: base.html, home.html, article.html, category.html.
Lo que quiero es tener un "sidebar" en cada pagina, que solo sea incluirlo en base.html.

Se puede lograr perfectamente agregando un objects.all en cada vista, pero la idea seria crear una función para que todo quede en la misma, el problema es que debo pasarle un "request" y crearle su respectiva "urlconf" pero como estamos claro yo no quiero una pagina "sidebar/" si no bloque mas para agregar un "sidebar". Amigos no se si los he liado, aquí algo de código:

Código Python:
Ver original
  1. from blog.models import Post, Categoria
  2.  
  3. def index_view(request):
  4.     post = Post.objects.all().order_by("-fecha")
  5.     lastsidebar = Post.objects.all().order_by("-titulo")[:100]
  6.     catsidebar = Categoria.objects.all()
  7.     return render_to_response("home.html", {'post': post, 'cat': cat sidebar, 'last': last sidebar})
  8.  
  9. #si notan siempre tengo que agregar lastsidebar y catsidebar en cada view que cree.
  10. def post_view(request, slug):
  11.     post = get_object_or_404(Post, slug=slug)
  12.     catsidebar = Categoria.objects.all().order_by("-titulo")
  13.     lastsidebar = Post.objects.all().order_by("-titulo")[:100]
  14.     return render_to_response("post.html", {'post': post, 'cat': cat sidebar, 'last': last sidebar})
  15.  
  16. #Lo que quiero es eliminar lastsidebar y catsibdear de todas las views y agruparlo en una función sidebar.
  17. #El problema es que necesito pasar el parámetro request pero como no es una pagina, no tengo idea como hacerlo.
  18. def sidebar():
  19.     #.............
  20.     return render_to_response('sidebar.html', ctx)

Así como esta funciona, pero quisiera saber lo anterior mencionado y también si creando una función aparte para el sidebar realizaría menos consultas.

Muchas Gracias si me pueden sacar de esa duda, mas que todo porque quiero saber como funciona.

Saludos.
  #2 (permalink)  
Antiguo 15/10/2012, 11:22
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Imprimir una vista sin el parametro request

Lo que puedes hacer es crear un contexto personalizado, para que sea transparente.

Es bastante fácil:

1.- Creas tu modulo de contexto por ejemplo context_processor.py dentro de tu app.
Código Python:
Ver original
  1. from blog.models import Post, Categoria
  2.  
  3. def categorias(request):
  4.     catsidebar = Categoria.objects.all()
  5.     lastsidebar = Post.objects.all().order_by("-titulo")[:100]
  6.     return {'cat': catsidebar, 'last': lastsidebar}

2.- Añades el contexto a tu proyecto.
Código Python:
Ver original
  1. # settings.py
  2. TEMPLATE_CONTEXT_PROCESSORS = (
  3. ...,
  4. 'blog.context_processor.categorias',
  5. )

3.- En tu vista no olvides añadir el contexto.
Código Python:
Ver original
  1. from blog.models import Post
  2. from django.template import RequestContext
  3.  
  4. def index_view(request):
  5.     post = Post.objects.all().order_by("-fecha")
  6.     return render_to_response("home.html", {'post': post}, context_instance=RequestContext(request))

Última edición por razpeitia; 15/10/2012 a las 13:02 Razón: camel case
  #3 (permalink)  
Antiguo 15/10/2012, 12:21
 
Fecha de Ingreso: octubre-2012
Ubicación: Trujillo
Mensajes: 29
Antigüedad: 11 años, 6 meses
Puntos: 6
Respuesta: Imprimir una vista sin el parametro request

Gracias razpeitia, crees que este minimizando consultas a la db de esta manera¿?, lo que quiero es tratar de que el código sea lo menos pesado para el servidor, muchas gracias por tu aporte.

Saludos.
  #4 (permalink)  
Antiguo 15/10/2012, 13:05
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Imprimir una vista sin el parametro request

No, definitivamente no. Las consultas a la db no se minimizan. Siempre llames al contexto hará las consultas correspondientes.
  #5 (permalink)  
Antiguo 15/10/2012, 17:29
 
Fecha de Ingreso: octubre-2012
Ubicación: Trujillo
Mensajes: 29
Antigüedad: 11 años, 6 meses
Puntos: 6
Respuesta: Imprimir una vista sin el parametro request

Hola, definitivamente, indagando en la documentación de Django y con tu ayuda en primera parte, por lo que he entendido es mucho mejor renderizar una plantilla con shortcut render así sabemos que disponemos y que no, por fin entiendo para que sirve ContextRequest xS.

PD: Sabes como manejar un campo en una tabla y que se pueda agregar varios campos en la misma id.

Saludos.
  #6 (permalink)  
Antiguo 15/10/2012, 19:03
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Imprimir una vista sin el parametro request

Cita:
Iniciado por xcodex Ver Mensaje
indagando en la documentación de Django
La documentación de Django es genial esta muy bien documentada.

Cita:
Iniciado por xcodex Ver Mensaje
y con tu ayuda en primera parte
Gracias (supongo)

Cita:
Iniciado por xcodex Ver Mensaje
PD: Sabes como manejar un campo en una tabla y que se pueda agregar varios campos en la misma id.
Tu dices una llave foranea (lo que es lo mismo a una relación OneToMany)?
  #7 (permalink)  
Antiguo 15/10/2012, 23:23
 
Fecha de Ingreso: octubre-2012
Ubicación: Trujillo
Mensajes: 29
Antigüedad: 11 años, 6 meses
Puntos: 6
Respuesta: Imprimir una vista sin el parametro request

La idea consiste en que cada vez que se agregue una Opción Inline tenga automáticamente un numero en orden 1,2,3... cuantas veces se agregue mas campos, como ejemplo:
Código Python:
Ver original
  1. from django.db import models
  2. class Encuesta(models.Model):
  3.     pregunta = models.CharField(max_length=200)
  4.     pub_date = models.DateTimeField('date published')
  5.  
  6.     def __unicode__(self):
  7.         return self.pregunta
  8.  
  9. class Opcion(models.Model):
  10.     encuesta = models.ForeignKey(Encuesta)
  11.     elecion = models.CharField(max_length=200, default=n)#aqui sera el campo default Foto 1, pero si agrega otro campo seria Foto 2, lo que cambiara seria el numero automáticamente de acuerdo a los campos que se agreguen en el admin.
  12.     votos = models.IntegerField()
  13.  
  14.     def __unicode__(self):
  15.         return self.elecion

Código Python:
Ver original
  1. # -*- encoding: utf-8 -*-
  2. from django.contrib import admin
  3. from pruebas.aplicaciones.blog.models import Encuesta, Opcion
  4.  
  5. class OpcionInline(admin.TabularInline):
  6.     model = Opcion
  7.     extra = 1 # esta es la clave cada vez que agregue un inlines en default le asigne un 2,3,4,5... al field.
  8. class EncuestaAdmin(admin.ModelAdmin):
  9.     list_display = ('pregunta', 'pub_date')
  10.     fieldsets = [
  11.         (None, {'fields': ['pregunta']}),
  12.         ('Informacion', {'fields': ['pub_date'], 'classes': ['collapse']}),
  13.     ]
  14.     inlines = [OpcionInline]
  15.  
  16. admin.site.register(Encuesta, EncuestaAdmin)
  17.     pass
  18. class OpcionAdmin(admin.ModelAdmin):
  19.  
  20. admin.site.register(Opcion, OpcionAdmin)

Jaja espero me haya echo explicar, intente con for dentro de models pero no me funciona.
Ahora viendo, esta el tema para filtrar todos los relationships asociadas a una sola ID en la platilla
Saludos y gracias.

Última edición por xcodex; 16/10/2012 a las 01:21
  #8 (permalink)  
Antiguo 16/10/2012, 02:53
 
Fecha de Ingreso: octubre-2012
Ubicación: Trujillo
Mensajes: 29
Antigüedad: 11 años, 6 meses
Puntos: 6
Respuesta: Imprimir una vista sin el parametro request

Os dejo una captura, ya he logrado hacerlo con ForeignKey con ManyToMany no pude, el problema ahora es como renderizarlo en la plantilla, he tratado con objects.filter y llevo toda la noche y parte de la madruga tratando y no he logrado imprimir con un for todos los links de su respectivo post.


Etiquetas: django
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:19.