Как редактировать форму с помощью Imagefield без обновления Photo?

Я пробовал множество способов исправить эту ошибку и, похоже, не могу ее решить. У меня есть форма для профиля пользователя, профиль автоматически создается, когда пользователь регистрируется, и он получает фотографию по умолчанию, пока не загрузит свою собственную. Когда они загружают фотографию, все работает нормально, включая информацию профиля. Однако, если они редактируют информацию профиля только после того, как у них уже есть собственная фотография профиля, и не меняют фотографию, я получаю MultiValueDictKeyError и значение исключения для 'image'

Ниже приведены мои взгляды...


    def editProfile(request):
        if 'user_id' not in request.session:
            return redirect('/')
        user = User.objects.get(id=request.session['user_id'])
        context = {
            'user': user,
        }
        return render(request, 'editProfile.html', context)
    
    # updates edited information on profile and updates new image photo.
    
    
    def updateProfile(request, user_id):
        userProfile = User.objects.get(id=request.session['user_id'])
        userProfile.profile.location = request.POST['location']
        userProfile.profile.favorite = request.POST['favorite']
        userProfile.profile.about = request.POST['about']
        userProfile.profile.image = request.FILES['image']
        userProfile.save()
    
        return redirect(f'/userProfile')

вот мои модели:


   class User(models.Model):
       first_name = models.CharField(max_length=45, null=True)
       last_name = models.CharField(max_length=45, null=True)
       username = models.CharField(max_length=255, null=True)
       email = models.EmailField(unique=True)
       password = models.CharField(max_length=45)
       confirm_pw = models.CharField(max_length=45)
       objects = UserManager()
       date_created = models.DateTimeField(auto_now_add=True)
       date_updated = models.DateTimeField(auto_now=True)
   
       def __str__(self):
           return self.username
   
   
   class Profile(models.Model):
       user = models.OneToOneField(User, unique=True, on_delete=models.CASCADE)
       location = models.CharField(max_length=45, null=True)
       favorite = models.CharField(max_length=255, null=True)
       about = models.TextField(null=True)
       image = models.ImageField(default='default.jpg', upload_to='profile_pics', blank=True)
   
       def __str__(self):
           return f'{self.user.username} Profile'

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

Если вы используете обычный HTML <form>, а не тот, который генерирует Django, посмотрите на значение атрибута name в теге <img>.

При выполнении этой строки:

userProfile.profile.image = request.FILES['image']

Ключ для request.FILES должен быть таким же, как name для тега <img>. В противном случае вы получите ошибку MultiValueDictKeyError. Не используйте image в качестве ключа только потому, что так вы назвали его в модели.

Если вы используете ModelForm, то это не проблема, потому что Django автоматически присваивает имена полям на основе их имен в моделях.

Просто оператор if перед userProfile.profile.image

``` if 'image' in request.FILES
userProfile.profile.image = request.FILES['image']```

Итак, если у кого-нибудь еще есть эта проблема, я надеюсь, что это поможет. Я застрял на этом на 2 дня.

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