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/'