Django 如何使用ModelForm替换图像?

Django 如何使用ModelForm替换图像?,django,Django,我有一个用户档案模型,其中保存了他们的“照片”。我正在使用modelForm来呈现一个概要文件更新表单。构建工作表单很容易,但现在我需要对图像进行一些调整: 1) 它与用户提供的文件名一起保存;我宁愿指定要使用的文件名。我想我应该只使用模型的PK和相同的文件扩展名,例如:“443.jpg” 2) 它应该替换现有图像,而不是附加下划线。“443.jpg” 我希望这样的事情就足够了: form = MemberProfileForm(request.POST, request.FILES,

我有一个用户档案模型,其中保存了他们的“照片”。我正在使用modelForm来呈现一个概要文件更新表单。构建工作表单很容易,但现在我需要对图像进行一些调整:

1) 它与用户提供的文件名一起保存;我宁愿指定要使用的文件名。我想我应该只使用模型的PK和相同的文件扩展名,例如:“443.jpg”

2) 它应该替换现有图像,而不是附加下划线。“443.jpg”

我希望这样的事情就足够了:

    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”(AttributeError)

我是否需要对整个过程进行修改以使用“form”而不是“modelform”来进行这些小调整,或者是否有一种简单的方法来控制图像的保存

x-----------------------------------------------------------------------------------------------

这似乎解决了它

    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'。

通过将实例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)

django官方网站上有一套关于如何处理文件上传和修改位置的非常好的方法。这应该可以回答您关于处理文件上载位置的问题


关于图像不是表单的一部分,它位于数据字典中。您可以在
表单中找到它。已清理的_data['image']

谢谢,但是这个问题试图用您所描述的内容来解决几个问题。它不会覆盖旧图像。看(1)和(2)。哦,好了,这就是(1)的全部错误。因此,对于(2),我看不出如何将“save=False”传递给modelform中的图像保存例程,但我可以先删除现有图像,这样会得到相同的结果。有关显示解决方案的编辑,请参见问题。
profile=Member.objects.get(user=request.user)
form=MemberProfileForm(data=request.POST, files=request.FILES, instance=profile)