Django Guardar imágenes desde string
Para guardar una imagen en un campo de tipo ImageField de Model desde una cadena como un POST http o desde memoria hacemos lo siguiente:
from django.core.files.uploadedfile import SimpleUploadedFile
import cStringIO
buf = cStringIO.StringIO()
# adquirimos imagen y la guardamos en buf i.e. mediante pycurl
foto = SimpleUploadedFile('imagen.jpg', buf.getvalue(), "image/jpeg")
# ahora foto contiene el stream pero en formato 'fichero'
p=Modelo( imagen=foto )
p.save()
Espero que os sirva ;-)
Django Evitar error en el administrador "decoding Unicode is not supported"
Si, como es probable, os habéis encontrado con este error en el administrador cuando examináis modelos con caracteres utf-8, creo que puede deberse al hecho de que django sirve los strings en unicode pero sin codificar.
En python, en el momento que intentamos algo como esto:
>>> unicode('pepe', 'utf-8')
u'pepe'
>>> unicode(u'pepe', 'utf-8')
Traceback (most recent call last):
File "
TypeError: decoding Unicode is not supported
Obtenemos el TypeError. En el admin de django, el error lo obtendremos siempre que grabemos caracteres >255. Parece provenir del hecho de codificar el unicode en ascii en vez de utf-8 ¿?.
Si hacemos:
def __unicode__(self):
return unicode(self.descripcion)
Obtendremos el error de decodificación ascii, pero si hacemos...
def __unicode__(self):
return unicode(self.descripcion, 'utf-8')
...nos funcionará pero no podremos usar el admin para examinar el modelo porque nos genera el error anterior.
Tenemos dos posibilidades, aunque no las comprendo en profundidad:
Solución 1):
from django.utils.encoding import smart_unicode
En los modelos poner:
def __unicode__(self):
return smart_unicode(("%s" % self.descripcion))
Solución 2) Llamado "método del literal"
def __unicode__(self):
return (u"%s" % self.descripcion)
En todo caso es conveniente poner el setting
DEFAULT_CHARSET='utf-8'
que fuerza utf-8 a la hora de procesar y servir las plantillas.
Más info sobre este tema estaría bien. En mi caso uso mysql con utf-8 y ordenación spanish2, ubuntu 10.10 con utf-8 y apache forzado a servir utf-8.