Buenas gente, estoy haciendo mis primeros experimentos con Python, tratando de pasar mi web en PHP a Python.
Actualmente en mi web tengo lo siguiente,
Cuando agrego una nueva noticia se sube con una imagen, y cuando yo actualizo el campo "urltag", la imagen se copia y se borra la anterior.
Ahora en python, estoy tratando de hacer eso, logré que se copie la imagen, también puedo hacer que se borre la imagen anterior, pero el valor del ImageField queda igual, no sé como cambiarlo.
Este es mi models.py
Código Python:
Ver originalfrom django.db import models, settings
from datetime import datetime
from django.forms import ModelForm
from PIL import Image
import urllib2, urlparse
from django.core.files.base import ContentFile
import os
import shutil
from django.core.files import File
def upload_to(self, filename):
return 'prensa/%s' % (self.urltag+".jpg")
def has_changed(instance, field):
if not instance.pk:
return False
old_value = instance.__class__._default_manager.\
filter(pk=instance.pk).values(field).get()[field]
return not getattr(instance, field) == old_value
class Comunicado(models.Model):
titulo = models.CharField(max_length=50)
contenido = models.TextField()
tags = models.CharField(max_length=255)
fecha_creado = models.DateTimeField(null=True, blank=True)
urltag = models.CharField(max_length=255)
photo = models.ImageField(upload_to=upload_to)
def save(self, size=(200, 200),*args, **kwargs):
if not self.id and not self.photo:
return
super(Comunicado, self, *args, **kwargs).save()
pw = self.photo.width
ph = self.photo.height
nw = size[0]
nh = size[1]
# only do this if the image needs resizing
if (pw, ph) != (nw, nh):
filename = str(self.photo.path)
image = Image.open(filename)
tags = self.tags + ".jpg"
pr = float(pw) / float(ph)
nr = float(nw) / float(nh)
if pr > nr:
# photo aspect is wider than destination ratio
tw = int(round(nh * pr))
image = image.resize((tw, nh), Image.ANTIALIAS)
l = int(round(( tw - nw ) / 2.0))
image = image.crop((l, 0, l + nw, nh))
elif pr < nr:
# photo aspect is taller than destination ratio
th = int(round(nw / pr))
image = image.resize((nw, th), Image.ANTIALIAS)
t = int(round(( th - nh ) / 2.0))
print((0, t, nw, t + nh))
image = image.crop((0, t, nw, t + nh))
else:
# photo aspect matches the destination ratio
image = image.resize(size, Image.ANTIALIAS)
image.save(tags)
if self.id:
old = Comunicado.objects.get(pk=self.id)
old_value = old.urltag
url_nueva = "/home/archivos/public_html/prensa/" + self.urltag + ".jpg"
shutil.copy (filename, url_nueva)
filename = url_nueva
image_url = "http://archivos.brotecolectivo.com/prensa/"+ self.urltag + ".jpg" # get this url from somewhere
image_data = urllib2.urlopen(image_url, timeout=50)
filename2 = urlparse.urlparse(image_data.geturl()).path.split('/')[-1]
self.photo= filename2
self.photo.save(
filename2,
ContentFile(image_data.read()),
save=False
)
class Meta:
db_table = 'comunicados_prensa'
def __unicode__(self):
return self.titulo
En la última parte, traté de guardar la imagen usando self.photo.save (photo es mi ImageField), pero no funciona.
¿como podría hacer esto?, osea, que el ImageField se actualice sin subir de nuevo la imagen, solamente usando la URL del fichero renombrado al cambiar el urltag.
Desde ya muchas gracias y disculpas si no expliqué bien el problema.