Как редактировать форму с помощью 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 дня.