Как установить вызываемый параметр для параметра по умолчанию >> 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)