Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create & return a default ImageFieldFile from inside a function

In my UserProfile model I would like to have a function which returns either the user's ImageFileField object or a default image if the user has not uploaded their own.

For example:

class UserProfile(models.Model):
    pic = models.ImageField('Headshot',blank=True,
                             upload_to=get_path_and_filename)

    def get_pic(self):
        if self.pic:
            return self.pic
        else:
            # return ImageFileField with a default value

I want to return an equivalent ImageFileField because I have filters that work with this object type (so I can't just pass it a string, easily) ... I tried looking at the source code but I can't quite figure out how to do it myself.

Is there an easy way to initialize a new ImageFileField object by passing it a path to an image file and then return it?

PS: I had thought about using a default setting for the ImageField, however, it seems less flexible because the file is stored at model creation ... and if I later want to change the default file, I would have to update all the database entries that had the old file.

like image 529
thornomad Avatar asked Oct 15 '09 00:10

thornomad


1 Answers

It was probably a typo, but what you actually want to return is an ImageFieldFile.

The ImageField makes the property of the model instance actually aa ImageFileDescriptor. When you access the property, it returns an ImageFieldFile instance.

As long as you don't call the save() or delete() methods of the ImageFieldFile, you can instanciate one reasonably easily:

from django.db.models.fields.files import ImageFieldFile, FileField

class UserProfile(models.Model):
    # ...

    def get_pic(self):
        if self.pic:
            return self.pic
        return ImageFieldFile(instance=None, field=FileField(),
                              name='pictures/default.jpg')
like image 156
SmileyChris Avatar answered Nov 20 '22 04:11

SmileyChris