Создать и вернуть стандартный ImageFieldFile изнутри функции

В моей модели UserProfile я хотел бы иметь функцию, которая возвращает либо пользователя ImageFileField объект или изображение по умолчанию, если пользователь не загрузил свой собственный.

Например:

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

Я хочу вернуть эквивалент ImageFileField потому что у меня есть фильтры, которые работают с этим типом объекта (поэтому я не могу просто передать ему строку) ... Я попытался посмотреть на исходный код, но я не могу понять, как это сделать сам.

Есть ли простой способ инициализировать новый ImageFileField объект, передав ему путь к файлу изображения, а затем вернуть его?

PS: я думал об использовании настройки по умолчанию для ImageField, однако он кажется менее гибким, потому что файл сохраняется при создании модели... и если позже я захочу изменить файл по умолчанию, мне придется обновить всю базу данных записи, которые имели старый файл.

1 ответ

Решение

Вероятно, это была опечатка, но на самом деле вы хотите вернуть ImageFieldFile,

ImageField делает свойство экземпляра модели на самом деле аа ImageFileDescriptor, Когда вы получаете доступ к свойству, он возвращает ImageFieldFile пример.

Пока ты не называешь save() или же delete() Методы ImageFieldFile, вы можете легко создать один из них:

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')
Другие вопросы по тегам