Django 1.10:在更新后渲染ModelForm时,ImageFields在更改时会丢失

时间:2017-01-06 14:36:18

标签: python django django-forms

# models.py
class Profile(models.Model):
    name = models.CharField(max_length=255)
    image = models.ImageField(upload_to=image_path, blank=True, null=True)

# forms.py
class ProfileForm(ModelForm):
    class Meta:
        model = Profile
        fields = '__all__'

# views.py
def profile(request, id):
    p = get_object_or_404(Profile, pk=id)
    profile_form = ProfileForm(request.POST or None, 
                               files=request.FILES or None, 
                               instance=p)

    if request.method == 'POST':
        if profile_form.is_valid():
            profile_form.save()

    return render(request, 'profile.html', {'form': profile_form})

#profile.html
<form method="post" action="" enctype="multipart/form-data" >
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit" />
</form>

如果用户GETs / profile / 1和1存在,他们会获得预填充所有值的表单,包括图像(如果有)

如果用户随后对除图像以外的任何字段进行POST更新(清除或更改),则在更新后页面会正确呈现。

但是,如果用户更改图像(清除或更改),则更改不会反映在渲染结果中:图像始终显示为空。快速GET解决了这种情况并显示了变化的情况。

有谁知道为什么图像字段在这种情况下不显示更新?

1 个答案:

答案 0 :(得分:0)

成功保存配置文件表单时,是否必须对某个地方(显然使用GET)进行某种重定向?您总是返回render....,如果您有POST请求,表单将保留POST数据。所以它应该是:

# views.py
def profile(request, id):
    p = get_object_or_404(Profile, pk=id)
    profile_form = ProfileForm(request.POST or None, files=request.FILES or None, instance=q)

    if request.method == 'POST':
        if profile_form.is_valid():
            profile_form.save()
            # do the GET request to some page
            return redirect('some-view-name', foo='bar')

    return render(request, 'profile.html', {'form': profile_form})