widgets formularios form fields example python django

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)