2017-02-18 60 views
0

我有以下看法Django的视图重定向到URL它不应该

def edit_booking(request, pk=None): 
    if not request.user.is_authenticated: 
     raise Http404 

    agent = Agent.objects.get(user=request.user) 
    booking = get_object_or_404(Booking, pk=pk) 

    form = BookingForm(request.POST or None, instance=booking) 
    if form.is_valid(): 
     instance = form.save(commit=False) 
     instance.save() 
     return HttpResponseRedirect(instance.get_absolute_url()) 
    elif form.errors: 
     messages.error(request,"There was a problem, please try again") 

    context = { 
     "form": form, 
    } 
    return render(request,'booking_form.html', context) 

我用下面的urls.py

urlpatterns = [ 
    url(r'^booking/create', create_booking, name="create-booking"), 
    url(r'^booking/$', booking_list, name="booking-list"), 
    url(r'^booking/(?P<pk>\d+)/$', booking_detail, name="booking-detail"), 
    url(r'^booking/(?P<pk>\d+)/edit', edit_booking, name="edit-booking"), 
] 

出于某种原因,当我尝试编辑一些预订后提交表单(例如http://127.0.0.1:8000/booking/24/edit)我自动重定向到(http://127.0.0.1:8000/booking/24/)。

据我可以告诉django没有处理视图中的任何进一步的代码。我试图找出简单的打印(“东西”),以查看代码中的结尾,但只要我从模板提交,就立即转到网址。为了完整起见,这是模板:

{% extends 'base.html' %} 
<div class="col-sm-6 col-sm-offset 3"> 
{% block content %} 
<form method="POST" action=".">{% csrf_token %} 
    {{ form.as_p }} 
    <input type="submit" value="Save"/> 
</form> 
{% endblock %} 
</div> 

回答

0

您需要检查请求的方法,否则它会在最初的形式呈现重定向因为Django使用初始渲染和提交表单同样的观点。

if request.method == 'POST': 
    if form.is_valid(): 
     instance = form.save(commit=False) 
     instance.save() 
     return HttpResponseRedirect(instance.get_absolute_url())  
    elif form.errors: 
     messages.error(request,"There was a problem, please try again") 
else: 
    context = { 
     "form": form, 
    } 
    return render(request,'booking_form.html', context) 
1

“。”,您用作窗体的操作,被浏览器解释为“当前路径目录的基础”。由于您的/ edit URL中没有使用尾部斜线,因此浏览器会将表格提交至最近的基地,即/ booking/24。

你应该总是使用尾随斜线:

url(r'^booking/create/$', create_booking, name="create-booking"), 
url(r'^booking/$', booking_list, name="booking-list"), 
url(r'^booking/(?P<pk>\d+)/$', booking_detail, name="booking-detail"), 
url(r'^booking/(?P<pk>\d+)/edit/$', edit_booking, name="edit-booking"),