Как сохранить изображение в Django?

В модели прописано следующее:

// другие поля ...
avatar = models.ImageField(upload_to='images/user_avatars', default='', null=True)

Форма html

<form method="post" action="{% url 'user_profile:edit_information' %}" enctype="multipart/form-data">
    <input name="avatar" class="form-control" type="file" id="formFile">

Ну и контроллере есть метод в котором вся логика

UserProfile.objects.filter(user_id=user.id).update(
    // другие поля
    company=request.POST.get('company'),
    avatar=request.FILES.get('avatar')
)

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

Что бы сохранить изображение отправленное с HTML формы, нужно создать объект модели и вызвать метод, создающий данные в БД. При вызове объекта рекомендую поменять поле модели avatar на FileField:

    avatar = models.FileField(upload_to='images/user_avatars', ...)

После чего уже вызвать нужный метод:

    UserProfile.objects.create(
        avatar = req.FILES.get('avatar')
    )

Или его аналог, который обновляет запись, а если ее нет, то добавляет ее в таблицу:

    queryset = req.FILES
    
    kwargs = {..., "avatar":queryset['avatar']}
    
    UserProfile.objects.update_or_create(
        критерий_выборки_для_обновления = ...
        defaults = kwargs
    )
Back to Top