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 original
from 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.