# 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解决了这种情况并显示了变化的情况。
有谁知道为什么图像字段在这种情况下不显示更新?
答案 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})