Skip to main content
 首页 » 编程设计

python之Django:如何通过 ModelForm 更新个人资料图片

2024年08月26日29lautakyan007

我正在尝试编写一个小型 Django 系统。登录系统后,用户可以编辑和保存自己的个人资料信息。涉及的字段有:用户名、电子邮件、名字、姓氏、网站和图片。

问题:图片无法更新(选择图片点击“更新”按钮后,显示“未选择文件”,页面显示的头像还是旧的) ).但是其他字段都OK。

这是我的代码:

模型.py:

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
 
    website = models.URLField(blank=True) 
    picture = models.ImageField(upload_to="profile_images", blank=True) 
 
    def __str__(self): 
        return self.user.username 

表单.py:

class UserForm2(forms.ModelForm): 
 
    class Meta: 
        model = User 
        fields = ('username', 'email', 'first_name', 'last_name') 
 
class UserProfileForm(forms.ModelForm): 
    class Meta: 
        model = UserProfile 
        fields = ('website', 'picture') 

views.py:

@login_required 
def update_user(request): 
 
    try: 
        user_profile = UserProfile.objects.get(user=request.user) 
    except UserProfile.DoesNotExist: 
        return HttpResponse("invalid user_profile!") 
 
    if request.method == "POST": 
        update_user_form = UserForm2(data=request.POST, instance=request.user) 
        update_profile_form = UserProfileForm(data=request.POST, instance=user_profile) 
 
        if update_user_form.is_valid() and update_profile_form.is_valid(): 
            user = update_user_form.save() 
            profile = update_profile_form.save(commit=False) 
            profile.user = user 
 
            if 'picture' in request.FILES: 
                profile.picture = request.FILES['picture'] 
 
            profile.save() 
 
        else: 
            print(update_user_form.errors, update_profile_form.errors) 
    else: 
        update_user_form = UserForm2(instance=request.user) 
        update_profile_form = UserProfileForm(instance=user_profile) 
 
    return render(request, 
            'userprofile/update_user.html', 
            {'update_user_form': update_user_form, 'update_profile_form': update_profile_form} 
            ) 

update_user.html:

<form id="update_user_form" method="POST" action="/userprofile/update_user/"> 
    {% csrf_token %} 
    {{ update_user_form.as_p }} 
    {{ update_profile_form.as_p }} 
    <img src="{{ update_profile_form.instance.picture.url }}" /> 
    <br /> 
    <input type="SUBMIT" name="submit" value="Update"/> 
</form> 

如何让它正常工作?

请您参考如下方法:

要上传文件,您应该添加 enctype 属性为 <form>标签:

<form id="update_user_form" method="POST" action="/userprofile/update_user/" 
                            enctype="multipart/form-data">