我可以在填充所有字段的情况下加载实例,但是当我单击“提交”时,所做的修改不会保存。实际上,但是在我的函数中添加了打印语句,该代码不会加载到if request.method ==“ POST” :(请参阅追溯)之外。
[04/Feb/2019 15:38:30] "GET /testimonypost/ HTTP/1.1" 200 8081 Not Found: /testimonypost/.jpg
[04/Feb/2019 15:38:30] "GET /testimonypost/.jpg HTTP/1.1" 404 17479 a [04/Feb/2019 15:38:35] "GET /40/testimony/edit HTTP/1.1" 200 5321 Not Found: /40/testimony/.jpg
[04/Feb/2019 15:38:35] "GET /40/testimony/.jpg HTTP/1.1" 404 17476
[04/Feb/2019 15:38:56] "POST /40/testimony/ HTTP/1.1" 200 4224 Not Found: /40/testimony/.jpg
[04/Feb/2019 15:38:56] "GET /40/testimony/.jpg HTTP/1.1" 404 17476
链接到表单
<a href="{% url 'testimonyedit' objects.id %}">edit</a>
模板表格
<form class="form-group" action="." method="POST" enctype="multipart/form-data">
{%csrf_token%}
{%for field in form%}
<div class="col-sm-offset-2 col-sm-10">
<span class="text-danger small">{{field.errors}}</span>
</div>
<label class="control-label col-sm-2"{{field.label_tag}}</label>
<div class="col-sm-10">{{field}}</div>
{%endfor%}
<button type="submit" class="btn btn-success">Submit</button>
</form>
urlpatterns = [
path('<int:id>/testimony/edit', views.TestimonyUpdate, name='testimonyedit'),
]
@login_required
def TestimonyUpdate(request, id=None):
instance=get_object_or_404(Testimony, id=id, user=request.user)
if instance.user == request.user:
form = TestimonyForm(request.POST or None, request.FILES or None, instance=instance)
print('a')
if request.method == "POST":
print('4')
if form.is_valid():
form = TestimonyForm(request.POST or None, request.FILES or None)
print('3')
instance=form.save(commit=False)
instance.save()
context={
"instance":instance
}
return render(request, 'details.html', context)
return render(request, 'variablized_form.html', {"form": form})
else:
return HttpResponse('You are unauthorized to edit this post')
答案 0 :(得分:0)
我认为您做出了一些错误的假设,并且您的代码在更新实例方面存在一些缺陷。让我们一一解决:
首先,当您点击“提交”按钮时,它会发出post请求。因此,request.method == "POST"
之后的行将被执行。
第二,当表单验证失败时,或者您正在发出get请求(只是用url击中地址),它将不会在request.method == "POST"
之后执行代码。
第三,实例未更新,因为您需要在TestimonyForm
代码块内的if request.method=='POST'
中传递实例,如下所示:
form = TestimonyForm(request.POST or None, request.FILES or None)
if form.is_valid():
instance=form.save(commit=False)
instance.save()
最后,我将像这样重构您的代码:
def update_testimony(request, id=None): # used snake case for method name. Please see PEP8 style guide regarding naming.
instance=get_object_or_404(Testimony, id=id, user=request.user). # getting Testimony object
form = TestimonyForm(request.POST or None, request.FILES or None, instance=instance). # initiating TestimonyForm form
if request.method == "POST": # checking request type
if form.is_valid(): # checking if form is valid
instance=form.save() # saving the form to update the instance
context={
"instance":instance
}
return render(request, 'details.html', context)
return render(request, 'variablized_form.html', {"form": form}). # returning form for get request