Почему мое изображение не сохраняется в каталоге мультимедиа?
Я использую 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")