Django: Загрузка файла изображения аватара в медиа-папку пользовательского профиля пользователя не работает

В настоящее время я пытаюсь создать пользовательскую модель пользователя, чтобы иметь возможность добавить поле Avatar-Imagefield к любому пользователю.

Поэтому я создал модель Profile с аватарами в качестве каталога (media/avatars/) для всех изображений:

class Profile(models.Model):

user = models.OneToOneField(User, on_delete=models.CASCADE)
avatar = models.ImageField('Avatar', upload_to="avatars", default="avatars/profil_picture_icon.png")

Я создал необходимые классы ProfileInline и UserAdmin:

class ProfileInline(admin.StackedInline):
model = Profile
can_delete = False

class UserAdmin(BaseUserAdmin):
inlines = (ProfileInline,)

admin.site.unregister(User)
admin.site.register(User, UserAdmin)

Я также определил media-directory внутри настроек:

MEDIA_ROOT = BASE_DIR / 'media'
MEDIA_URL = '/media/'

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

class ProfileForm(forms.ModelForm):

class Meta:
    model = models.Profile
    exclude = ('user',)


def post_save_receiver(sender, instance, created, **kwargs):
if created:
    user_profile = models.Profile(user=instance)
    user_profile.save()

post_save.connect(post_save_receiver, sender=settings.AUTH_USER_MODEL)

Внутри моего шаблона я создал форму с полем Avatar-ImageField и кнопкой Save-Button для загрузки этого изображения:

     <form action="/profil/" method="post" id="avatar_form">
    {% csrf_token %}

     <img style="border-radius: 100px" id= "Profil_Image" src=" {{ user.profile.avatar.url }}">
        {% load widget_tweaks %}
        {{ profile_form.avatar|add_class:"profile_form" }}

     <button id="update_button" style="left: 1210px; top: 385px" type="submit" form="avatar_form" name="avatar_update_btn" value="">Speichern</button>

 </form>

Последнее внутри моего views.py пользователь может обновить Default-Image

        elif 'avatar_update_btn' in request.POST:
        profile_form = ProfileForm(request.POST, request.FILES)
        models.Profile.objects.filter(user=request.user).update(avatar="avatars/" + profile_form.data['avatar'])

-> И здесь у нас есть Проблема.

Он обновляет Avatar-URL в базе данных с правильным именем файла, но не может найти изображение после перезагрузки страницы, потому что изображение не было загружено в папку media/avatars/, и я понятия не имею почему.

Как только я сохраняю изображение на странице администратора, все работает отлично и создается новый экземпляр изображения в папке avatars. Но как только я пытаюсь загрузить его с помощью ImageField, он не создает новый экземпляр изображения внутри папки.

Я думаю, что это должно быть как-то связано с "update" - функцией модели. Возможно, при "update" просто меняется URL без создания нового Image-Instance, поэтому я попытался загрузить его с помощью profile_form.save() - функции. Но она не позволяет мне сохранить его, так как функция save()- хочет создать новую Model-Instance, но Profile-Model уже существует.

Можешь мне помочь?

Спасибо заранее.

Я полагаю, что проблема связана с вашим файлом settings.py. BASE_DIR очевидно является базовым каталогом вашего проекта, в котором находится manage.py. Таким образом, ваша папка media должна быть в этой директории, иначе Django не найдет ее. И я так понимаю, что у вас есть папка с названием avatar внутри папки media. Попробуйте:

    import os

    BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # You probably already have this
    print(BASE_DIR) # Do this to check if your BASE_DIR is correct
    ...

    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
    MEDIA_URL = '/media/'
Вернуться на верх