Django возвращает только URL-адрес изображения по умолчанию

#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)