【问题标题】:django view redirects to URL it shouldn'tdjango 视图重定向到它不应该的 URL
【发布时间】:2017-02-18 16:36:34
【问题描述】:

我有以下看法

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 没有在视图中处理任何进一步的代码。我试图用简单的 print("something") 来查看它在代码中的最终位置,但只要我从模板提交,它就会立即转到 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>

【问题讨论】:

    标签: django


    【解决方案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"),
    

    【讨论】:

      【解决方案2】:

      您需要检查请求方法,否则它将在初始表单呈现时重定向,因为 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)
      

      【讨论】:

        猜你喜欢
        • 2021-06-16
        • 2012-11-25
        • 1970-01-01
        • 2020-07-04
        • 2021-10-13
        • 2021-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多