Изображение по умолчанию для ImageField в ORM Django

Я использую ImageField для хранения изображений профиля на моей модели.

Как мне настроить возврат изображения по умолчанию, если изображение не определено?


person Yuvi    schedule 14.08.2009    source источник


Ответы (6)


Я не пробовал это, но я почти уверен, что вы можете просто установить его по умолчанию в своем поле.

pic = models.ImageField(upload_to='blah', default='path/to/my/default/image.jpg')

ИЗМЕНИТЬ: глупый StackOverflow не позволяет мне комментировать ответы других людей, но этот старый фрагмент - не то, что вам нужно. Я настоятельно рекомендую django-imagekit, потому что он отлично подходит для изменения размера изображений и манипуляций. очень легко и чисто.

person ericflo    schedule 14.08.2009
comment
Спасибо за эту ссылку - похоже, я буду использовать ее в будущем. - person Yuvi; 14.08.2009
comment
@ericflo: Да, StackOverflow не позволяет оставлять комментарии, пока у вас не будет 50 репутации, что немного раздражает. - person Powerlord; 14.08.2009
comment
На самом деле это работает. Хотя, возможно, не идеально ... Он ведет себя больше как «начальный», чем «по умолчанию», потому что он устанавливает значение по умолчанию при создании, но если вы удалите изображение, оно не вернет значение по умолчанию. Таким образом, вы можете захотеть установить это значение по умолчанию как постоянное где-нибудь и вернуть его вручную при удалении. - person John Mee; 30.09.2009

В models.py

image = models.ImageField(upload_to='profile_pic', default='default.jpg')

В settings.py добавьте это:

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

Теперь вручную добавьте изображение с именем «default» в папку мультимедиа.

person Manish    schedule 13.02.2019
comment
Пробовал, но ничего не вышло. - person DerekPK; 09.07.2021
comment
добавьте urlpatterns = [...] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) в config / urls.py вашего проекта - person Alexander P; 04.08.2021

Теоретически вы также можете использовать функцию в определении вашей модели. Но я не знаю, хорошая ли это практика:

class Image(model.Models):
    image = ....

    def getImage(self):
        if not self.image:
            # depending on your template
            return default_path or default_image_object

а затем в шаблоне

   <img src="img.getImage" />

Это дает вам большую гибкость в будущем ...

Я с большим успехом использую sorl для создания миниатюр

person msmart    schedule 14.08.2009
comment
Django уже предоставляет для этой цели метод url (): ‹img src = {{my_image.url}}› - person shanyu; 14.08.2009
comment
Верно, но это не сможет предоставить URL-адрес по умолчанию. Вы можете создать собственный класс ImageField с URL-адресом по умолчанию, который возвращается, если значение изображения равно None. - person Jordan Reiter; 26.04.2011

В вашем поле изображения

field = models.ImageField(upload_to='xyz',default='default.jpg')

Примечание: путь должен быть внутри MEDIA_ROOT.

person cz game    schedule 31.01.2018

вы можете попробовать это на свой взгляд:

{% ifequal object.image None %}
    <img src="DEFAULT_IMAGE" />
{% else %}
    display image
{% endifequal %}
person imjoevasquez    schedule 14.08.2009
comment
{% if obj.image%} display {% else%} ‹img src = default /› {% endif%} - записать все теги {% ifequal%} !! - person SmileyChris; 14.08.2009
comment
если он вам нужен во всех ваших представлениях, вы можете использовать include, вы можете назвать его show_obj_image.html, а затем использовать {% include show_obj_image.html%} - person imjoevasquez; 16.08.2009

Вы можете указать начальное значение с помощью параметра default. Если изображение уже существует, и вы хотите установить его по умолчанию (вместо его удаления), вы можете попробовать что-то вроде этого:

DEFAULT = 'img/default.jpg'

class Example(models.Model):
    image = models.ImageField(default=DEFAULT)

    def set_image_to_default(self):
        self.image.delete(save=False)  # delete old image file
        self.image = DEFAULT
        self.save()

Затем вы можете использовать set_image_to_default() вместо image.delete(), если предпочитаете значение по умолчанию.

person Balik    schedule 12.07.2017