Skip to main content
 首页 » 编程设计

python之使用 update() 方法时 Django ImageField 不更新

2024年09月03日28cloudgamer

我正在从 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 中目录(我上传所有图片的地方)

View .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">用于从模板中获取图像

请您参考如下方法:

QuerySet.update() 方法不会在模型上调用 save(),因此不会执行将图像放入存储的常用机制。此外,您必须从 request.FILES 而不是 request.POST 中检索上传的图像。

如果您在模型实例上设置属性然后调用 save(),而不是使用 update(),图像应该保存到正确的位置磁盘。例如:

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" 属性集。