Search code examples
djangodjango-modelsdjango-imagekit

django-imagekit get model attribute


I have the following model:

class PropertyPhoto(models.Model):
    property = models.ForeignKey('Property')
    photo_show = ProcessedImageField(upload_to=get_web_watermark,
                                  processors=[Watermark()],                                     
                                  options={'quality': 95})

and custom Watermark class:

class Watermark(object):    

    def process(self, image):
        try:
            this_property = Property.objects.get(pk=*self.property.id*)
        except Property.DoesNotExist:
            print "error"

How do I access my model attribute "property" from inside Watermark class?

Thank you


Solution

  • You'll need to create a custom spec that gets the information you need from the model and passes it to your processor. The docs show an example:

    from django.db import models
    from imagekit import ImageSpec, register
    from imagekit.models import ImageSpecField
    from imagekit.processors import ResizeToFill
    from imagekit.utils import get_field_info
    
    class AvatarThumbnail(ImageSpec):
        format = 'JPEG'
        options = {'quality': 60}
    
        @property
        def processors(self):
            model, field_name = get_field_info(self.source)
            return [ResizeToFill(model.thumbnail_width, thumbnail.avatar_height)]
    
    register.generator('myapp:profile:avatar_thumbnail', AvatarThumbnail)
    
    class Profile(models.Model):
        avatar = models.ImageField(upload_to='avatars')
        avatar_thumbnail = ImageSpecField(source='avatar',
                                          id='myapp:profile:avatar_thumbnail')
        thumbnail_width = models.PositiveIntegerField()
        thumbnail_height = models.PositiveIntegerField()
    

    Note that you can pass the spec directly to the ImageSpecField constructor (using the spec kwarg) instead of registering it with an id (and using the id kwarg) as shown above.