//barrabarra

JAVIER ROMERO
Programación web y escritorio
 

Our blog, keeping you up-to-date on our latest news.

 

Django y error No module named models

mayo 27, 2010 at 9:19 am | Blog, Programación | 1 comment

 

Esta mañana estaba refactorizando un poco el código de la aplicación de tiendas antes de subirlo al repositorio de un cliente y me he encontrado con el error que describe el título y que me ha traído de cabeza toda la mañana.

Uno de los cambios que estaba haciendo al código era sustituir líneas del tipo:
from tienda.checkout.models import *
por
from checkout.models import *
para mejorar la portabilidad de las aplicaciones, pero a raíz de eso el sitio dejó de funcionar y lo único que recibía era ese mensaje de error.

A la postre resulta que tenía una estructura de directorios y ficheros tal que así:
cart\
   __init__.py
   admin.py
   models.py
   cart.py
   views.py
checkout\
   __init__.py
   admin.py
   models.py
   checkout.py
   views.py

etc.

El problema ocurría cuando python interpretaba los ficheros cart.py y checkout.py (entre otros) e intentaba luego buscar modelos en ellos al tener el mismo nombre que el directorio en el que se encuentran.

La solución una vez sabido esto fué sencilla, cambiar los nombres por cart_functions.py y checkout_functions.py a los archivos y en todos aquellos lugares en los que se usaban.

 

Error en Django Admin al buscar: Related Field has invalid lookup: icontains

mayo 24, 2010 at 5:20 pm | Blog, Programación | 3 comments

 

Mientras buscaba en un gran listado de productos desde la administración de django me he topado con el siguiente error:

Related Field has invalid lookup: icontains

A la postre resulta que el problema venía por cómo estaba definida la clase de administración del modelo:


class ProductAdmin(admin.ModelAdmin):
   # sets values for how the admin site lists your products
   list_display = ('name', 'price', 'brand', 'stock', 'is_pack', 'created_at', 'updated_at',)
   ...
   search_fields = ['name', 'categories', 'brand', 'internal_reference', 'description']
   ...

Y es que ‘categories’ es una clave externa (ForeignKey) y por eso hay que definir sobre qué campo asociado se buscará, se soluciona, por ejemplo, con:


   search_fields = ['name', 'categories__name', 'brand', 'internal_reference', 'description']

 

Django: Flatpages devuelven error 404

mayo 17, 2010 at 8:08 pm | Blog, Programación | No comment

 

Los últimos proyectos en los que estoy trabajando van sobre una plataforma de comercio electrónico.
Como tal, a la hora de mostrar errores a los visitantes/clientes, es importante no desconcertarlos y hacer que pierdan la confianza en el sitio web, por lo cual se personalizan las páginas de error para que se integren en el resto del sitio y además se aprovecha para mostrarle productos que podrían interesarle.

Debido a estos listados de productos no podemos simplemente renderizar un template para los errores, sino que he implementado un manejador para los errores: file_not_found_404 y handler_500. Estos hacían bien su trabajo mientras realizaba el desarrollo en local, sin embargo, cuando se pasaba a pruebas en el entorno de producción todas las páginas estáticas definidas con el framework flatpages direccionaban a la página de error 404.

Después de muchas vueltas, pruebas, desactivar el manejador, revisar logs y volver a probar y a dar vueltas ví que en los logs de acceso las páginas de errores 404 devolvían un status 200 (Ok), lo cual finalmente me dió la pista que necesitaba: tenía que sobreescribir el status_code de la respuesta a 404, ya que por defecto el valor es 200.

El manejador quedó con algo parecido a esto:


def file_not_found_404(request):
page_title = _('Page Not Found')

featured = Product.featured.all()[0:FEATURED_PER_ROW]
bestseller = Product.bestseller.all()[0:BESTSELLER_PER_ROW]
recommended = Product.recommended.all()[0:RECOMMENDED_PER_ROW]

response = render_to_response('404.html', locals(), context_instance=RequestContext(request))
response.status_code = 404
return response

 

Categorias:

Archivo: