2017-02-18 3 views
0

я должен иметь видавид Джанго перенаправляет 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 не обрабатывает дальнейший код в представлении. Я попытался выяснить с помощью простой печати («что-то»), чтобы увидеть, где находится код, но он сразу же отправляется на URL сразу после отправки из шаблона. Для полноты это шаблон:

{% 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

Вы должны проверить метод запроса в противном случае он будет перенаправлять на первоначальном виде рендеринг, потому что Джанго использует один и тот же вид для начального рендеринга и представления формы.

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

«», который вы использовали в качестве действия формы, интерпретируется браузерами, как „основа текущего каталога пути“. Поскольку вы не использовали конечную косую черту в 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"), 
Смежные вопросы