Django ImageField не обновляется при использовании метода update () - PullRequest
0 голосов
/ 04 января 2019

Я обновляю некоторые поля в модели из файла views.py. Все остальные поля корректно обновляются при использовании

Profile.objects.filter(id=user_profile.id).update(
        bio=bio,
        city=city,
        date_of_birth=dob,
        profile_pic=profile_pic,
        gender=gender
    )
Только

, profile_pic = models.ImageField(blank=True) не обновляется. Странно то, что когда я проверяю свою модель Profile из admins.py, она показывает имя файла, который я загрузил, но мой файл не отображается в моем каталоге /media ( куда я загружаю все свои изображения)

views.py

def edit_submit(request):
if request.method == 'POST':
    profile_pic = request.POST.get('profile_pic')
    bio = request.POST.get('bio')
    city = request.POST.get('city')
    dob = request.POST.get('dob')
    gender = request.POST.get('gender')
    user_profile = Profile.objects.get(user=request.user)
    Profile.objects.filter(id=user_profile.id).update(
        bio=bio,
        city=city,
        date_of_birth=dob,
        profile_pic=profile_pic,
        gender=gender
    )
    return HttpResponseRedirect(reverse('profile', args=[user_profile.id]))

Вот так я управляю своими медиа-файлами в settings.py

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

Я думаю, что только текст хранится в ImageField, и изображение не загружается в каталог /media Примечание: я использую <input type="file" name="profile_pic" class="change_user_img"> для получения изображения из шаблона

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Метод QuerySet.update() не вызывает save() на модели, поэтому обычный механизм, который помещает изображение в хранилище, не выполняется. Кроме того, вы должны получить загруженное изображение из request.FILES, а не request.POST.

Вместо использования update(), если вы установите атрибуты для экземпляра модели и затем вызовете save(), изображение должно быть сохранено в правильном месте на диске. Например:

profile_pic = request.FILES.get('profile_pic')  # Use request.FILES

bio = request.POST.get('bio')
city = request.POST.get('city')
dob = request.POST.get('dob')
gender = request.POST.get('gender')

user_profile = Profile.objects.get(user=request.user)
user_profile.bio = bio
user_profile.city = city
user_profile.date_of_birth = dob
user_profile.profile_pic = profile_pic
user_profile.gender = gender
user_profile.save()

Как уже упоминалось в комментариях, вы также должны убедиться, что в вашей форме установлено enctype="multipart/form-data".

0 голосов
/ 04 января 2019

Укажите upload_to на profile_pic = ...: Документы здесь .

...