Почему мое изображение не сохраняется в каталоге мультимедиа?

Я использую Django. Мое изображение сохраняется при отправке формы, но оно не сохраняется в каталог медиа. Сохраняется только файл. Например, оно сохраняется как "file.png", но не "avatars/file.png". Отмечу, что из портала администратора изображение сохраняется, как и ожидалось.

Вот мои файлы:

from django.db import models
from django.contrib.auth import get_user_model

class Profile(models.Model):
    user = models.OneToOneField(get_user_model(), on_delete=models.CASCADE)
    avatar = models.ImageField(default='avatars/Screenshot_2022-11-30_at_7.18.28_PM.png', upload_to='avatars/')
    header = models.FileField(default='headers/Screenshot_2022-11-30_at_7.18.28_PM.png', upload_to='headers/')
    followers = models.ManyToManyField(get_user_model(), related_name='followers', blank=True)
from django.shortcuts import render, redirect, HttpResponseRedirect
from django.contrib.auth import get_user_model
from django.views.generic import ListView, DetailView, View
from django.contrib.auth.mixins import LoginRequiredMixin
from .models import Profile

def updateProf(request):

    Profile.objects.filter(user_id=request.POST['user_id']).update(avatar=request.FILES['avatar'])
    return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
{% extends 'base.html' %}
{% load crispy_forms_tags %}

{% block content %}
<div class="signup-form">
    <h2>Edit profile</h2>
    <form method="post" action="/update-prof" enctype="multipart/form-data">
        {% csrf_token %}
        <input type="hidden" name="user_id" value="2">
        <input type="file" name="avatar">
        <button class="btn btn-success" type="submit">Save changes</button>
    </form>
</div>
{% endblock %}

И мой файл настроек/урлов:

MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'
] + static(
    settings.MEDIA_URL, document_root=settings.MEDIA_ROOT
)

Я думал, что добавление поля enctype/request.FILES решит проблему, но это не помогло. Кто-нибудь знает, как я могу заставить файл сохраняться в avatars/ ?

Метод .update() работает на уровне базы данных и игнорирует upload_to. Он также может перезаписать аватары других пользователей, если используется одинаковое имя файла, в то время как на самом деле файл должен храниться с уникальным именем.

Правильным способом является использование правильной формы для обновления данных на основе пользовательского ввода, но если вы торопитесь, это также должно работать:

try:
    profile = Profile.objects.get(user_id=request.POST['user_id'])
    profile.avatar = request.FILES['avatar']
    profile.save()
except Profile.DoesNotFound:
    return HttpResponseNotFound("User not found")
Вернуться на верх