I am updating some of fields in model from views.py file. All other fields are updated properly when I use
Profile.objects.filter(id=user_profile.id).update(
bio=bio,
city=city,
date_of_birth=dob,
profile_pic=profile_pic,
gender=gender
)
only, profile_pic = models.ImageField(blank=True)
is not updated, Weird thing is when I check my Profile
model from admins.py it shows me the file name which I uploaded, But my file is not shown in my /media
directory(where I upload my all Images)
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]))
This is how I manage my media files in settings.py
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
I think only text is stored in ImageField and Image is not uploded to /media
directory
Note: I am using <input type="file" name="profile_pic" class="change_user_img">
for getting image from template
Specify
upload_to
onprofile_pic = ...
: Docs here.The
QuerySet.update()
method doesn't callsave()
on the model, and so the usual mechanism that places the image into storage is not executed. In addition, you must retrieve the uploaded image fromrequest.FILES
notrequest.POST
.Rather than using
update()
, if you set the attributes on the model instance and then callsave()
, the image should get saved to the correct place on disk. For example:As mentioned in the comments, you must also ensure that the your form has
enctype="multipart/form-data"
set.