我有一个用户个人资料模型,其中包含他们的'照片'图像。我正在使用modelForm来呈现配置文件更新表单。构建工作表单很容易,但现在我需要对图像进行一些调整:
1)它保存用户提供的文件名;我宁愿指定要使用的文件名。我以为我只是使用模型的PK,以及相同的文件扩展名,例如:“443.jpg”
2)它应该替换现有的图像,而不是附加下划线。 “443 ___。JPG”。
class Member(models.Model):
home_phone = models.CharField(max_length=10, blank=True)
image = models.ImageField(upload_to='members', default="default.png")
...
class MemberProfileForm(forms.ModelForm):
home_phone = AUPhoneNumberField(required=False)
class Meta:
model = Member
exclude = ('email','password','create_date','last_login','is_active')
我希望这样的事情能够完成:
form = MemberProfileForm(request.POST, request.FILES, instance=request.member)
if form.is_valid():
if request.FILES.get("image"):
form.image.name = 'poobar.jpg'
form.save()
return HttpResponseRedirect(reverse('my-profile'))
但是'image'在modelform(AttributeError)中不存在
我是否需要重新整理使用“form”而不是“modelform”来进行这些小调整,还是有一种简单的方法来控制图像的保存?
X ---------------------------------------------- ------------------------------------------------- < / p>
这似乎解决了它......
form = MemberProfileForm(request.POST, request.FILES, instance=request.member)
if form.is_valid():
if form.cleaned_data['image']:
(path, extension) = os.path.splitext(form.cleaned_data['image'].name)
form.cleaned_data['image'].name = ('%s%s' % (request.member.id, extension))
request.member.image.delete()
form.save()
...除了大多数人可能想要'request.user',我有'request.member'。
答案 0 :(得分:2)
通过将实例kwarg传递给表单,它知道要覆盖旧数据
form = MemberProfileForm(request.POST, request.FILES, instance=request.member)
if form.is_valid():
form.save()
假设request.member
是会员实例,例如
profile=Member.objects.get(user=request.user)
form=MemberProfileForm(data=request.POST, files=request.FILES, instance=profile)
答案 1 :(得分:1)
官方django网站上有一套非常好的documentation关于如何处理文件上传和修改其位置的信息。这应该回答你关于处理文件上传位置的问题。
关于图像不是表单的一部分,它位于cleaning_data字典中。您会发现它位于form.cleaned_data['image']
。