Как установить вызываемый параметр для параметра по умолчанию >> Imagefield в Django

Итак, у меня есть модель, которая будет содержать несколько сотен экземпляров, и я добавил поле изображения logo. Поскольку я не хочу загружать каждый логотип через админку вручную, я хочу установить вызываемый объект, который возвращает правильный путь к файлу, чтобы я мог просто переместить логотипы в папку media/company_logos. Из-за некоторых технических проблем я могу поместить логотипы в папку только после создания их экземпляра

# models.py

def logo_directory_path(instance, filename):
    return f'company_logos/{instance.symbol}'

class Company(models.Model):

    symbol = models.CharField(max_length=50)
    logo = models.ImageField(upload_to='company_logos/', default=logo_directory_path(instance=symbol, filename=f'{symbol}.png'))

Выдает ошибку на instance=symbol, говорящую

Тип 'str' не имеет ожидаемого атрибута 'symbol'

Другой подход был

logo = models.ImageField(upload_to='company_logos/', default=f'company_logos/{symbol}')

, который возвращает URL в виде src="/media/company_logos/<django.db.models.fields.CharField>"

Я не совсем уверен, как это настроить, так как не могу полностью понять официальную документацию .

Мой желаемый результат - иметь URL для default следующим образом:

company_logos/IBM.png с полем symbol, являющимся соответствующей частью (я пробовал через f-строку).

Update to Ankits request --> При попытке создать новый экземпляр с помощью предложенного кода выкидывает

logo_directory_path() не хватает 2 обязательных позиционных аргументов: 'instance' и 'filename'

Вот обновленный код

def logo_directory_path(instance, filename):
    if not hasattr(instance, 'symbol'):
       return f'company_logos/{filename}'
    return f'company_logos/{instance.symbol}'

class Company(models.Model):

    symbol = models.CharField(max_length=50)
    logo = models.ImageField(upload_to=logo_directory_path, default=logo_directory_path)

приведенный выше код вернет путь к изображению, например company_logos/IBM.png если ваш instance имеет атрибут symbol, а если нет, то он вернет символ файла по умолчанию, вы можете изменить filename если не хотите устанавливать имя по умолчанию filename файла

Вы используете логику в uploaded_to=… параметре [Django-doc], так:

from pathlib import Path


class Company(models.Model):
    def logo_directory_path(self, filename):
        return f'company_logos/{self.symbol}{Path(filename).suffix}'

    symbol = models.CharField(max_length=50)
    logo = models.ImageField(upload_to=logo_directory_path)
Вернуться на верх