Django ImageField по умолчанию

models.py:

class UserProfile(models.Model):

    photo = models.ImageField(upload_to = get_upload_file_name,
                              storage = OverwriteStorage(),
                              default = os.path.join(settings.STATIC_ROOT,'images','generic_profile_photo.jpg'),
                              height_field = 'photo_height',
                              width_field = 'photo_width')
    photo_height = models.PositiveIntegerField(blank = True, default = 0)
    photo_width = models.PositiveIntegerField(blank = True, default = 0)

views.py:

def EditProfile(request):

    register_generator()
    source_file = UserProfile.objects.get(user = request.user).photo

    args = {}
    args.update(csrf(request))
    args.update({'source_file' : source_file})

где-то в моем шаблоне:

{% generateimage 'user_profile:thumbnail' source=source_file %}

Я получаю сообщение об ошибке: соответствующий запрос UserProfile не существует.

в этой строке:

source_file = UserProfile.objects.get(user = request.user).photo

Проблема в том, что атрибут ImageField по умолчанию не работает. Таким образом, объект не создается внутри моей модели. Как правильно использовать этот атрибут? Если я опущу этот атрибут, объект будет создан без ошибок. Мне нужно пройти абсолютный или относительный путь? Я использую django-imagekit для изменения размера изображения перед его отображением: http://django-imagekit.readthedocs.org/en/latest/


person Mihai Zamfir    schedule 22.03.2014    source источник


Ответы (1)


Если вы не зададите атрибут по умолчанию, будет ли успешно загружаться изображение? Когда я реализовал ImageField в своем собственном проекте django, я не использовал атрибут по умолчанию. Вместо этого я написал этот метод, чтобы получить путь к изображению по умолчанию:

def image_url(self):
"""
Returns the URL of the image associated with this Object.
If an image hasn't been uploaded yet, it returns a stock image

:returns: str -- the image url

"""
    if self.image and hasattr(self.image, 'url'):
        return self.image.url
    else:
        return '/static/images/sample.jpg'

Затем в шаблоне отобразите изображение с помощью:

<img src="{{ MyObject.image_url }}" alt="MyObject's Image">

РЕДАКТИРОВАТЬ: простой пример

В views.py

def ExampleView(request):
    profile = UserProfile.objects.get(user = request.user)
    return render(request, 'ExampleTemplate.html', { 'MyObject' : profile } )

Затем в шаблон включите код

<img src="{{ MyObject.image_url }}" alt="MyObject's Image">

будет отображать изображение.

Также для ошибки «Соответствующий запрос UserProfile не существует». Я предполагаю, что вы определили отношение внешнего ключа к модели User где-то в вашей модели UserProfile, верно?

person ryan    schedule 22.03.2014
comment
Да, это верно для вашего последнего вопроса. Я попробую ваше решение. Он работает нормально, если не добавлять атрибут по умолчанию - person Mihai Zamfir; 23.03.2014
comment
Соответствующее представление: pastebin.com/bfwrwgSB и форма: pastebin.com/3vSH4Sjw. Я использовал представления на основе классов - person ryan; 23.03.2014
comment
на самом деле, мне было любопытно, как вы вызываете метод image_url(). Или как создать и отправить объект MyObject в шаблон - person Mihai Zamfir; 23.03.2014
comment
проверьте мое редактирование. Я бы также посоветовал выполнить все изменения размера изображения и другую необходимую обработку перед его сохранением, если это возможно. - person ryan; 23.03.2014
comment
Эта великолепная идея - person Moustafa Elkady; 25.04.2017
comment
3 года спустя! Потрясающий ответ! - person Marco Herrarte; 20.10.2017