2017-02-18 59 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"),