#python #django #imagefield
#python #django #imagefield
Вопрос:
Я новичок в Django и создаю простое приложение для социальных сетей для добавления и просмотра сообщений.
Я использую сторону администратора для загрузки изображений профилей для пользователей, и это работает хорошо. Мне еще предстоит создать интерфейс для загрузки изображений профиля.
Я использую PostgreSQL, и я могу запросить, чтобы увидеть, что правильные URL-адреса сохраняются в таблице для изображений профиля. Но когда я пытаюсь извлечь эти изображения и отобразить, изображение по умолчанию (заданное в моделях.py) всегда отображается. Я могу открыть нужные изображения со стороны администратора, но Django возвращает только изображение по умолчанию.
В моем интерфейсе есть Javascript, в котором я использую fetch API для получения URL-адресов изображений профиля. Он работает хорошо, за исключением того, что возвращает только изображение по умолчанию.
Пожалуйста, помогите мне выяснить, где я ошибаюсь или почему только ‘defaultpp.jpg — всегда появляется. Я пытался использовать операторы печати в models.py и views.py и видеть только URL-адрес для ‘defaultpp.jpg — быть возвращенным.
models.py
def user_directory_path(instance, filename):
return f'{instance.profile_user.id}/{filename}'
class User(AbstractUser):
def __str__(self):
return f"User ID: {self.id} Username: {self.username}"
class UserProfile(models.Model):
profile_user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
profile_picture = models.ImageField(upload_to = user_directory_path, blank=True, null=True, default='defaultpp.jpg')
def __str__(self):
return f"User: {self.profile_user} Username: {self.profile_user.username}"
@property
def get_profile_picture_url(self):
if self.profile_picture and hasattr(self.profile_picture, 'url'):
return self.profile_picture.url
settings.py
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
DEBUG = True
STATIC_URL = '/static/'
# Root and URL for uploaded files to be stored
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
views.py
def profile_image(request, user):
user = User.objects.get(username=user)
profile = UserProfile(profile_user=user)
profile_picture_url = str(profile.get_profile_picture_url)
return JsonResponse({"image": profile_picture_url}, safe=False)
profile_picture_url = str(profile.get_profile_picture_url) здесь возвращает URL для ‘defaultpp.jpg «каждый раз, даже несмотря на то, что я загрузил туда какое-то другое изображение
urls.py
from django.contrib import admin
from django.urls import include, path
from django.conf.urls.static import static
from django.conf import settings
urlpatterns = [
path("admin/", admin.site.urls),
path("", include("network.urls")),
] static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
HTML и JS
<script>
//funtion to fetch profile image for each post and add it to the media object
function post_profile_image()
{
document.querySelectorAll('.profileimage').forEach(profileimage => {
let user = profileimage.dataset.user;
function assign_image(imageURL)
{
document.querySelectorAll(`.${user}`).forEach(e => {
e.src = imageURL;
});
}
fetch(`profile/image/${user}`)
.then(response => response.json())
.then(image => {
let imageURL;
imageURL = image.image;
assign_image(imageURL);
})
.catch(function() {
console.log("Could not fetch profile image");
});
});
}
document.addEventListener('DOMContentLoaded', function() {
//funtion to fetch profile image for each post and add it to the media object
post_profile_image();
});
</script>
<img class="img-thumbnail mr-3 profileimage {{ post.post_user }}" data-user='{{ post.post_user }}' src="" alt="profile image">
Структура папок
├───media
│ ├───1
│ ├───2
│ ├───29
│ ├───3
│ ├───34
│ ├───5
│ ├───7
│
├───network
│ ├───migrations
│ │ └───__pycache__
│ ├───static
│ │ └───network
│ ├───templates
│ │ └───network
│ └───__pycache__
└───project4
└───__pycache__
Изображения профиля, которые я загружаю со стороны администратора, попадают в каждую из пронумерованных папок (идентификаторов пользователей) в папке мультимедиа.
Ответ №1:
Я смог исправить это, исправив представление.
profile = UserProfile.objects.get(profile_user=user)