Tras ver que la mayoría de los proyectos existentes para generar miniaturas de imágenes aún no funcionan con la API de Storage y que algunos resultan algo complejos para lo que yo quería me puse a desarrollar un campo que lo hiciera del modo más sencillo posible.
La idea original era generar un campo que:
Y lo que surgió fue django-thumbs. En la página del proyecto tenéis toda la información necesaria para ponerlo a funcionar. Si buscáis algo más complejo y con más opciones tenéis sorl-thumbnail, aunque aún no soporta backends de almacenamiento.
Publicado por Antonio Melé el Martes 23 de Diciembre de 2008 | 3 comentarios | Categorías: imágenes, modelos, snippets
Saber si nuestro visitante viene de un buscador es interesante en varios casos. Por ejemplo para almacenar el término de búsqueda que le ha llevado a nuestro sitio web o desde qué buscador ha llegado para nutrir nuestras estadísticas. También nos sirve para destacar en nuestro sitio los términos de búsqueda sobre el resto del texto, facilitando que el usuario identifique rápidamente los fragmentos de información que le interesan.
En otras ocasiones queremos mostrar anuncios sólo a quienes llegan a nuestro sitio desde un buscador para favorecer a nuestros visitantes habituales mostrándoles nuestra web sin anuncios (quienes entran directamente escribiendo nuestra URL en su navegador). Lo que por otro lado también nos ayuda generalmente a aumentar nuestro CTR, ya que nuestros visitantes habituales suelen hacer menos caso a la publicidad de nuestro sitio web.
Este middleware te permite saber si el usuario proviene de un buscador y en tal caso acceder a la información de búsqueda: de qué buscador proviene y qué términos ha utilizado para la búsqueda. Para hacerlo funcionar debemos añadirlo a nuestro setting MIDDLEWARE_CLASSES. Con esto podremos acceder desde nuestras vistas a request.search_referrer_engine (nombre del buscador), request.search_referrer_domain (dominio del buscador) y request.search_referrer_term (término buscado).
Para poder acceder al objeto request desde nuestras plantillas debemos asegurarnos de que tenemos 'django.core.context_processors.request' en nuestro setting TEMPLATE_CONTEXT_PROCESSORS y que al cargar nuestras plantillas desde nuestras vistas utilizando render_to_response les pasamos RequestContext de la siguiente manera:
from django.template import RequestContext
from django.shortcuts import render_to_response
def mi_vista(request):
# ...
return render_to_response('my_template.html', mi_diccionario_de_datos, context_instance=RequestContext(request))
De esta manera hacemos disponibles las variables de contexto en nuestras plantillas. Nota: Las vistas genéricas (generic views) utilizan RequestContext siempre.
Ahora podremos acceder desde nuestras plantillas a la información por ejemplo para mostrar anuncios sólo a los visitantes que provienen de buscadores:
{% if request.search_referrer_engine %}
<div class="anuncios"> ... </div>
{% endif %}
Publicado por Antonio Melé el Lunes 22 de Diciembre de 2008 | 0 comentarios | Categorías: middleware, snippets
A través de la lista de correo estamos organizando un sprint online de traducción de la documentación de Django al español. El sprint se realizará del 9 al 11 de Enero y servirá para traducir al español las partes más importantes de la documentación. En el trac del proyecto encontrarás toda la información que necesitas para participar en la traducción de la documentación original.

Publicado por Antonio Melé el Viernes 19 de Diciembre de 2008 | 0 comentarios | Categorías: comunidad, sprint, traducciones
¿Quieres evitar el spam en tus formularios sin tener que utilizar captchas ni tener que recurrir a servicios de terceros como Askimet? Entonces magicforms probablemente sea lo que estés buscando. Creado por fíam (también creador de byNotes) estas dos clases que heredan de django.forms.Form y django.forms.ModelForm respectivamente te ayudan a engañar a los spambots y tener unos formularios limpos de spam.
¿Cómo se consigue? Utilizando un campo con estilo display:none para que no sea mostrado en el navegador (que hace de honeypot). Este campo no aparece en el navegador pero los spambots sí lo ven y tratarán de rellenarlo. El campo permite una longitud máxima de cero, por lo que el formulario no validará correctamente si este campo contiene alguna información. De esta forma se evita que se acepte un formulario rellenado por un spambot.
El otro método adicional añade un campo hidden que contiene un token generado a partir de la IP del visitante y el timestamp actual encriptados utilzando el setting SECTRET_KEY de tu proyecto como llave del cifrado. De esta forma al validar el formulario se descifra el valor del campo y se compara la IP del visitante con la almacenada anteriormente para verificar que son las mismas. Tras esto se compara el timestamp actual con el almacenado para que el formulario no valide correctamente si se ha enviado en menos de 5 segundos desde el timestamp inicial (demasiado rápido para ser un humano quien esté enviándolo) o más de 1 hora después por si el spambot reutiliza el token en el futuro.
Utilizarlo es realmente sencillo: En lugar de heredar de Form y ModelForm tus formularios deberán heredar de MagicForm y MagicModelForm. A la hora de utilizarlos en tus vistas al crear un objeto formulario deberás pasarle como argumentos request.META['REMOTE_ADDR'] (la IP del visitante) y un identificador único (por ejemplo el id del modelo asociado al formulario) además de los argumentos que quieras para el formulario. Suponiendo que tuvieramos un modelo Comentario como el siguiente:
from django.db import models
class Entrada(models.Model):
# ...
class Comentario(models.Model):
entrada = models.ForeignKey(Entrada)
texto = models.TextField()
El código para nuestro formuario sería:
from models import Comentario
from magicforms import MagicModelForm
class ComentarioForm(MagicModelForm):
class Meta:
model = Comentario
Y nuestra vista para añadir un comentario, suponiendo que le pasamos el id de la entrada por la URL sería:
from django.shortcuts import get_object_or_404
def add_comentario(request, entrada_id):
entrada = get_object_or_404(Entrada, id=entrada_id)
formulario = ComentarioForm(request.META['REMOTE_ADDR'], entrada.id)
if request.method == 'POST':
formulario = ComentarioForm(request.META['REMOTE_ADDR'], entrada.id, request.POST)
# ...
Descarga magicforms.py para Django. Puedes leer la entrada original en inglés sobre magicforms en el blog de fíam.
Publicado por Antonio Melé el Domingo 14 de Diciembre de 2008 | 4 comentarios | Categorías: forms, spam
Suscríbete a nuestro feed RSS y al feed de la comunidad para estar al tanto de todo lo que ocurre entorno a Django.
Tú también puedes escribir en éste blog. Para hacerlo basta con que nos digas sobre qué quieres escribir un artículo relacionado con Django.
Utilizar un formulario para modificar 2 modelos
Descubriendo objetos similares por sus etiquetas