python - formularios - Django. Anular guardar para modelo
django model form (7)
Antes de guardar el modelo, cambio el tamaño de una imagen. Pero, ¿cómo puedo verificar si se agregó una nueva imagen o solo se actualizó la descripción, por lo que puedo omitir el cambio de escala cada vez que se guarda el modelo?
class Model(model.Model):
image=models.ImageField(upload_to=''folder'')
thumb=models.ImageField(upload_to=''folder'')
description=models.CharField()
def save(self, *args, **kwargs):
if self.image:
small=rescale_image(self.image,width=100,height=100)
self.image_small=SimpleUploadedFile(name,small_pic)
super(Model, self).save(*args, **kwargs)
Quiero volver a escalar solo si se cargó nueva imagen o se actualizó la imagen, pero no cuando se actualizó la descripción.
Algunos pensamientos:
class Model(model.Model):
_image=models.ImageField(upload_to=''folder'')
thumb=models.ImageField(upload_to=''folder'')
description=models.CharField()
def set_image(self, val):
self._image = val
self._image_changed = True
# Or put whole logic in here
small = rescale_image(self.image,width=100,height=100)
self.image_small=SimpleUploadedFile(name,small_pic)
def get_image(self):
return self._image
image = property(get_image, set_image)
# this is not needed if small_image is created at set_image
def save(self, *args, **kwargs):
if getattr(self, ''_image_changed'', True):
small=rescale_image(self.image,width=100,height=100)
self.image_small=SimpleUploadedFile(name,small_pic)
super(Model, self).save(*args, **kwargs)
No estoy seguro si funcionaría bien con todas las herramientas django pseudo-auto (Ejemplo: ModelForm, contrib.admin, etc.).
Consulta la base de datos para un registro existente con el mismo PK. Compare los tamaños de archivo y las sumas de comprobación de las imágenes nuevas y existentes para ver si son las mismas.
En la nueva versión es así:
def validate(self, attrs):
has_unknown_fields = set(self.initial_data) - set(self.fields.keys())
if has_unknown_fields:
raise serializers.ValidationError("Do not send extra fields")
return attrs
He encontrado otra manera simple de almacenar los datos en la base de datos
models.py
class LinkModel(models.Model):
link = models.CharField(max_length=500)
shortLink = models.CharField(max_length=30,unique=True)
En la base de datos tengo solo 2 variables
views.py
class HomeView(TemplateView):
def post(self,request, *args, **kwargs):
form = LinkForm(request.POST)
if form.is_valid():
text = form.cleaned_data[''link''] # text for link
dbobj = LinkModel()
dbobj.link = text
self.no = self.gen.generateShortLink() # no for shortLink
dbobj.shortLink = str(self.no)
dbobj.save() # Saving from views.py
En esto, he creado la instancia de modelo en views.py solamente y poner / guardar datos en 2 variables solo desde vistas.
Lo que hice para lograr el objetivo fue hacer esto ...
# I added an extra_command argument that defaults to blank
def save(self, extra_command="", *args, **kwargs):
y debajo del método save () es esto ..
# override the save method to create an image thumbnail
if self.image and extra_command != "skip creating photo thumbnail":
# your logic here
así que cuando edito algunos campos pero no edito la imagen, pongo esto ...
Model.save("skip creating photo thumbnail")
puede reemplazar el "skip creating photo thumbnail"
con "im just editing the description"
o un texto más formal.
Espero que esto ayude!
Puede proporcionar argumentos adicionales para confirmar que se ha publicado una nueva imagen.
Algo como:
def save(self, new_image=False, *args, **kwargs):
if new_image:
small=rescale_image(self.image,width=100,height=100)
self.image_small=SimpleUploadedFile(name,small_pic)
super(Model, self).save(*args, **kwargs)
o pase la variable de solicitud
def save(self, request=False, *args, **kwargs):
if request and request.FILES.get(''image'',False):
small=rescale_image(self.image,width=100,height=100)
self.image_small=SimpleUploadedFile(name,small_pic)
super(Model, self).save(*args, **kwargs)
Creo que estos no romperán tu salvación cuando se los llame simplemente.
Puede poner esto en su admin.py para que esto también funcione con el sitio de administración (para la segunda de las soluciones anteriores):
class ModelAdmin(admin.ModelAdmin):
....
def save_model(self, request, obj, form, change):
instance = form.save(commit=False)
instance.save(request=request)
return instance
Verifique el campo pk del modelo. Si es Ninguno, entonces es un objeto nuevo.
class Model(model.Model):
image=models.ImageField(upload_to=''folder'')
thumb=models.ImageField(upload_to=''folder'')
description=models.CharField()
def save(self, *args, **kwargs):
if ''form'' in kwargs:
form=kwargs[''form'']
else:
form=None
if self.pk is None and form is not None and ''image'' in form.changed_data:
small=rescale_image(self.image,width=100,height=100)
self.image_small=SimpleUploadedFile(name,small_pic)
super(Model, self).save(*args, **kwargs)
Editar: agregué un cheque para ''imagen'' en form.changed_data. Esto supone que estás usando el sitio de administración para actualizar tus imágenes. También tendrá que anular el método predeterminado save_model como se indica a continuación.
class ModelAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
obj.save(form=form)