【问题标题】:How to update image input with django forms and template如何使用 django 表单和模板更新图像输入
【发布时间】:2019-08-28 20:45:10
【问题描述】:

我有一个 django 项目,其中用户有个人资料并且可以上传个人资料图片。 models.py 是:

`class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
name = models.CharField(max_length=64,blank=True)
profilePic = models.ImageField(blank=True, null=True, upload_to= "profile/")
phoneNumber = models.CharField(max_length=12,blank=True)
streetAddress = models.CharField(max_length=64,blank=True)`

在我的网站上,用户可以编辑他的个人资料,包括个人资料图片。为此,我有一个表单,其中初始值是最初存储的值。 forms.py 是:

class EditProfile(forms.ModelForm):
 def __init__(self, profile, *args, **kwargs):
    self.profile = profile
    super(EditProfile, self).__init__(*args, **kwargs)
    self.fields['name'] = forms.CharField(label='Name:', initial= profile.name,required=False)
    self.fields['phoneNumber'] = forms.CharField(label= "Phone Number:", initial= profile.phoneNumber,required=False)
    self.fields['streetAddress'] = forms.CharField(label='Street Address and/or Postal Code:', initial= profile.streetAddress,required=False)
    self.fields['profilePic'] = forms.ImageField(label='Profile Picture:', initial= profile.profilePic,required=False)

 class Meta:
    model = Profile
    fields = ("name", "phoneNumber","streetAddress", "profilePic")

这部分效果很好,在我的网站上我可以看到存储的值。问题是当我尝试编辑它们并提交表单时。 我的views.py是:

def settings(request):
user= request.user 
if request.method == 'GET':
    userProfile = Profile.objects.get(user=user)
    f1= UserProfile(user=request.user)
    f2= EditProfile(profile=userProfile)       
    return render(request, 'listings/settings.html', {'form': f1,'form2': f2})

elif request.method == 'POST':
    userProfile = Profile.objects.get(user=user)
    f1= UserProfile(user=request.user)
    f2= EditProfile(profile=userProfile)       
    name= request.POST["name"]
    phoneNumber = request.POST["phoneNumber"]
    streetAddress = request.POST["streetAddress"]
    Profile.objects.filter(user=user).update(name= name, phoneNumber = phoneNumber, streetAddress = streetAddress)
    if "profilePic" in request.FILES:
        image1=request.FILES["profilePic"]
        fs1=FileSystemStorage()
        fs1.save(image1.name, image1)
        userProfile.profilePic = image1
        userProfile.save()
    else:
        userProfile.profilePic.delete()


    messages.success(request, 'Your profile has been updated!')
    return redirect("/settings")

除了 imageFile 之外,所有内容都可以毫无问题地进行编辑。如果我上传文件,它会工作并且图像会更新。但是,如果我不更改 imageFile(即我想保留相同的图像),则 request.FILES 为空,然后代码转到 else 语句并删除现有的 profilePic。

我的问题是,我可以在我的网站上看到初始个人资料图片,因此 forms.py 可以正常工作,但为什么它没有与表单的其余部分一起提交?

【问题讨论】:

    标签: javascript python django templates


    【解决方案1】:

    您的问题有点令人困惑,但您似乎正在尝试重新发明轮子。如果您想将“初始”数据重新插入到表单中,您应该使用本机 instance 参数。你可以这样使用它:

    profile = Profile.objects.get(user=user)
    
    # This can be in your GET
    profile_form = EditProfile(instance=profile)
    
    # This can be in your POST
    profile_form = EditProfile(request.POST, request.FILES, instance=profile)
    profile_form.save()
    

    【讨论】:

    • 太好了,我让它工作了。我仍然知道 Django 并自己学习它,所以我仍然不知道它的大部分技巧。
    猜你喜欢
    • 2021-06-26
    • 2015-05-05
    • 2016-01-28
    • 1970-01-01
    • 2015-01-28
    • 2016-05-02
    • 2019-01-19
    • 2014-01-25
    • 1970-01-01
    相关资源
    最近更新 更多