Entries for Django
Cómo instalar MediaWiki dentro de un sitio Django con Apache2
4 May 2011
La idea es bastante sencilla. Disponemos de un sitio web en el que vamos a añadir MediaWiki en /wiki/. Así, por ejemplo, si nuestro dominio es http://www.plagaos.com/, en el cuál hay un proyecto Django en despliegue, vamos a tener http://www.plagaos.com/wiki/ sin que afecte al sitio. Además, MediaWiki hará uso de PostgreSQL.
Flatpages en Django 1.3: cómo saber la página activa
30 April 2011
Flatpages es una aplicación disponible en contrib que nos permite crear páginas planas en HTML. Si no necesitamos algo complicado y queremos añadir páginas estáticas a nuestro sitio, esta es nuestra aplicación.
En Django 1.3 han añadido un template tag para realizar un listado de las páginas. Aquí podemos ver el ejemplo disponible en la página oficial:
{% load flatpages %}
{% get_flatpages as flatpages %}
<ul>
{% for page in flatpages %}
<li><a href="{{ page.url }}">{{ page.title }}</a></li>
{% endfor %}
</ul>
Pero si con este listado queremos hacer un menú, siempre es interesante destacar la página en la que estemos situados.
Fallo de autenticación en PostgreSQL utilizando Django
12 April 2011
Estoy haciendo un pequeño despliegue de una aplicación de pruebas y lo estaba haciendo con PostgreSQL. Tras crear el usuario, dar permisos y todo lo típico, me he encontrado con lo siguiente:
# python manage.py syncdb
Traceback (most recent call last):
File "manage.py", line 11, in <module>
execute_manager(settings)
File "/usr/lib/pymodules/python2.6/django/core/management/__init__.py", line 438, in execute_manager
utility.execute()
File "/usr/lib/pymodules/python2.6/django/core/management/__init__.py", line 379, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/lib/pymodules/python2.6/django/core/management/base.py", line 191, in run_from_argv
self.execute(*args, **options.__dict__)
File "/usr/lib/pymodules/python2.6/django/core/management/base.py", line 220, in execute
output = self.handle(*args, **options)
File "/usr/lib/pymodules/python2.6/django/core/management/base.py", line 351, in handle
return self.handle_noargs(**options)
File "/usr/lib/pymodules/python2.6/django/core/management/commands/syncdb.py", line 52, in handle_noargs
cursor = connection.cursor()
File "/usr/lib/pymodules/python2.6/django/db/backends/__init__.py", line 75, in cursor
cursor = self._cursor()
File "/usr/lib/pymodules/python2.6/django/db/backends/postgresql_psycopg2/base.py", line 136, in _cursor
self.connection = Database.connect(**conn_params)
psycopg2.OperationalError: FATAL: la autentificación Ident falló para el usuario <<xxxx>>
'WSGIRequest' object has no attribute 'LANGUAGE_CODE'
14 March 2011
Un problema breve, una solución breve. Hace un poco tiempo estuve programando una página con soporte para internacionalización sobre Django 1.2 y me encontré con lo siguiente:
Request Method: GET
Django Version: 1.2
Exception Type: AttributeError
Exception Value:
'WSGIRequest' object has no attribute 'LANGUAGE_CODE'
Tras seguir la traza, llegué a la vista que estaba ocasionando el problema. En esta vista tenía algo como lo siguiente:
def view(request):
...
language = request.LANGUAGE_CODE
...
El problema: no está bien configurado el middleware. La solución:
MIDDLEWARE_CLASSES = (
...
'django.middleware.locale.LocaleMiddleware',
...
)
Guardar ficheros subidos mediante FileField en un lugar distinto a MEDIA_ROOT en Django
24 February 2011
Muy brevemente voy a explicar cómo podemos guardar ficheros en una ubicación distinta a MEDIA_ROOT. Esto es especialmente útil cuando quieres subir ficheros que puedan consultar los usuarios logueados, pero quieres que no tengan un acceso público (como todo el contenido de media):
from django.core.files.storage import FileSystemStorage
sistema_almacenamiento = FileSystemStorage(location='/ubicacion/distinta/a/media/')
class MiModelo(models.Model):
file = models.FileField(upload_to='ficheros', storage=sistema_almacenamiento)
¡Cuidado con los permisos de los directorios!
Publicando automáticamente en Twitter
28 January 2011
Básicamente este post se trata de una prueba simple. Estoy trabajando en un sistema para que automáticamente se publique un tweet al añadir una entrada.
Si el tiempo me lo permite, en los próximos días trataré de explicar como he realizado el proceso para conectar a Twitter desde Python. Adelantar que el software utilizado es tweepy.
Testear tu proyecto en Django 1.3 beta con VirtualEnv
19 January 2011
Ayer escribía una breve introducción acerca de VirtualEnv. Hoy voy a poner de manifiesto un posible uso. Para los entusiastas de nuevas features, como yo, pueden ir testeando proyectos y aplicaciones durante el desarrollo de Django e ir adaptando el código para que sea funcional.
Django, forms y ugettext: "TypeError: Lazy object returned unexpected type."
7 January 2011
Estaba programando tranquilamente un formulario (ModelForm) y de repente deja de renderizarse. Reviso la vista, el código de retorno, el HTML de salida... pero todo está correctamente salvo que el formulario no se visualiza.
El código es el siguiente:
models.py
from django.db import models
from django.utils.translation import ugettext_lazy as _
class MiModelo(models.Model):
...
campo = models.CharField(_(u''), ...)
forms.py:
from django import forms
class MiForm(forms.ModelForm):
class Meta:
model = MiModelo
Aparentemente todo está bien. Pero al ejecutar desde el shell (python manage.py shell) y tratar de renderizar el formulario me encuentro con el error:
TypeError: Lazy object returned unexpected type.
Agujero de seguridad generando contenido dinámico para una ForeignKey
24 December 2010
Hace un rato os contaba como generar contenido dinámico para una ForeignKey de un formulario, y mientras escribía he descubierto un agujero de seguridad.
Si modificamos el HTML del formulario, donde se selecciona el usuario, podemos cambiar el identificador del usuario manualmente y se añadiría de encargado a un usuario no permitido.
Generar contenido dinámico de una ForeignKey para un Form en Django
24 December 2010
Vamos a plantear el siguiente escenario:
class Grupo(models.Model):
usuarios = models.ForeignKey(User)
class Lista(models.Model):
grupo = models.ForeignKey(Grupo)
encargado = models.OneToOneField(User)
El objetivo es generar formularios para Lista donde el encargado sea un usuario del grupo.
Llamar a una función que recibe un parámetro desde una plantilla en Django
24 December 2010
Quien haya profundizado un poquito en el sistema de plantillas que ofrece Django sabrá que solamente se pueden invocar a funciones que no reciban parámetros.
Existe una forma de hacer esto, aunque no sé hasta que punto es correcta. Si es forzosamente necesario hacerlo, aquí explico como se puede hacer.
Cómo crear objetos automáticamente al ejecutar syncdb en Django
21 December 2010
Vamos a suponer una aplicación de noticias y etiquetas. Queremos que siempre exista una etiqueta 'general' que se usará en las noticias por defecto. Por supuesto, queremos automatizar el proceso, ya que es un coñazo tener que hacerlo manualmente cada vez que se crea la base de datos.
Para ello vamos a hacer uso del mecanismo de señales que ofrece Django.
Breves: Cómo listar los idiomas disponibles en Django
6 December 2010
>> from django.conf import settings
>> map(lambda lang_tuple:lang_tuple[0], settings.LANGUAGES)
['es', 'en', 'de']
Cómo hacer en Django una migración manual en producción
26 November 2010
Últimamente tengo aún menos tiempo, ya que estoy aprovechando PlagaOS para actualizar los módulos de MenudoProblema y crear algunos módulos que incorporaré más adelante. Pero aquí os dejo un pequeño problema:tras explorar la limitaciones de Django FlatPages decidí hacerme mi propio módulo de páginas estáticas. Lo desarrollé, lo incluí en la página del proyecto, hice el despliegue y como no, acabé haciendo un cambio en el modelo.
Crear una base de datos MySQL para Django
22 September 2010
Ya he escrito en varios artículos como crear una base de datos en MySQL. Para evitar repetir esto continuamente, voy a detallar la creación de una base de datos específica para Django.
La teoría es cuando crees saber algo, pero no funciona.
La práctica es cuando algo funciona, pero no sabes por qué.
Los programadores combinan la teoría y la práctica:
Nada funciona y no saben por qué.
