После сохранения данных в Django невозможно отобразить изображение. Код для этого приведен ниже

Изложение проблемы: На изображении по умолчанию видна фотография профиля, но мне нужно, чтобы загруженная фотография отображалась здесь, когда я загружу ее и сохраню в базе данных. Я использую фреймворк django.

Что я пробовал здесь?

В файле setting.html, Ниже приведен HTML код того, что пытались отобразить изображение, биографию, местоположение. Проблема может быть в первом теге div image. Хотя стандартная картинка профиля видна, но загруженная мной не отображается на странице и не сохраняется в базе данных.

<div class="col-span-2">
   <label for="">Profile Image</label>
   <img width = "100" height = "100" src="{{user_profile.profileimg.url}}"/>
   <input type="file" name='image' value = "" placeholder="No file chosen" class="shadow-none bg-gray-100">
</div>
<div class="col-span-2">
   <label for="about">Bio</label>  
   <textarea id="about" name="bio" rows="3"  class="shadow-none bg-gray-100">{{user_profile.bio}}</textarea>
</div> 
<div class="col-span-2">
   <label for=""> Location</label>
   <input type="text" name = "location" value = "{{user_profile.location}}" placeholder="" class="shadow-none bg-gray-100">
</div>

В файле views.py нижеприведенная функция является логикой страницы настроек файла views для отображения изображения, биографии, местоположения. Если изображение не загружено, то это будет картинка профиля по умолчанию. Если изображения нет, то отображается загруженное изображение. Но я не понимаю, в чем ошибка в моем коде.

@login_required(login_url='signin')
def settings(request):
    user_profile = Profile.objects.get(user = request.user)
    if request.method == "POST":
        if request.FILES.get('image')== None:
            image = user_profile.profileimg
            bio = request.POST['bio']
            location = request.POST['location']

            user_profile.profileimg = image
            user_profile.bio = bio
            user_profile.location = location
            user_profile.save()
        if request.FILES.get('image') != None:
            image = request.FILES.get('image')
            bio = request.POST['bio']
            location = request.POST['location']

            user_profile.profileimg = image
            user_profile.bio = bio
            user_profile.location = location
            user_profile.save()
        return redirect("settings")

    return render(request, 'setting.html', {'user_profile': user_profile})

Я ожидаю узнать, в чем ошибка в коде. Только profileimg не может быть сохранен в базе данных. остальные данные можно сохранить, например, биографию, местоположение.

Ниже представлен файл model.py.

from django.db import models
from django.contrib.auth import get_user_model

User = get_user_model()
# Create your models here.
class Profile(models.Model):
    user = models.ForeignKey(User, on_delete = models.CASCADE)
    id_user = models.IntegerField()
    bio = models.TextField(blank=True)
    profileimg = models.ImageField(upload_to = 'profile_images', default= 'blank-profile-picture.png')
    location = models.CharField(max_length = 100, blank = True)

    def __str__(self):
        return self.user.username

Ниже приведена папка media в файле settings.py.

MEDIA_URL ='/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

Просто вы можете попробовать этот способ:

<img width = "100" height = "100" src="/media/{{user_profile.profileimg}}"/>

И теперь это изображение будет отображаться

Примечание: Если загруженное изображение сохраняется в папке media, то приведенный выше код будет работать.

Согласно вашей модели поля profileimg, вы должны добавить прямой слэш к upload_to:

Он должен быть таким, как показано ниже:

upload_to='profile_images/'

И убедитесь, что вы добавили это в ваши основные url'ы:

urlpatterns = [

]+static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)

Вы пытаетесь получить изображение неправильным способом.

Вместо этого вы можете использовать следующее

src="/media/{{user_profile.profileimg}}"

Если это не работает, попробуйте убрать "/" перед media.

Пожалуйста, ответьте на это сообщение, если проблема все еще сохраняется.

О, Святое дерьмо. Как я мог пропустить это.

Моя проблема с просмотром.

Добавьте эту вещь к вашей функции:

    if request.method == "POST" and "image" in request.FILES:

При запросе изображения поместите изображение только в переменную в списке, как указано ниже.

        image= request.FILES['image']

Надеюсь, это поможет решить проблему. Пожалуйста, вернитесь, если проблема не исчезнет.

Спасибо за ваши ответы. Я нашел решение

<form action="" method ="POST" enctype = "multipart/form-data">

В файле setting.html отсутствует этот enctype. Это работает правильно, и изображение отображается корректно.

Вернуться на верх