如何使用ModelForm替换图像?

时间:2009-12-14 02:13:55

标签: django

我有一个用户个人资料模型,其中包含他们的'照片'图像。我正在使用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'。

2 个答案:

答案 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']