如何在POST请求后重定向到Django中的上一页

Ole*_*leg 27 django redirect

我遇到了一个我无法找到解决方案的问题.我在导航栏中有一个按钮,可以在所有页面上使用,它是一个负责创建一些内容的按钮.

查看与按钮链接:

def createadv(request):
    uw = getuw(request.user.username)
    if request.method =='POST':
    form = AdverForm(request.POST, request.FILES)
    if form.is_valid():
        form.instance.user = request.user
        form.save()
        return HttpResponseRedirect('/', {'username': request.user.username, 'uw': uw})
    args = {}
    args.update(csrf(request))
    args['username'] = request.user.username
    args['form'] = AdverForm()
    args['uw'] = uw
    return  render_to_response('createadv.html', args)
Run Code Online (Sandbox Code Playgroud)

如果您现在可以看到我在创建内容后总是重定向到主页'/',但我想回到我启动内容创建的页面.

Ant*_*ard 48

您可以next在表单中添加字段,并将其设置为request.path.处理完表单后,您可以重定向到此路径的值.

template.html

<form method="POST">
    {% csrf_token %}
    {{ form }}
    <input type="hidden" name="next" value="{{ request.path }}">
    <button type="submit">Let's Go</button>
</form>
Run Code Online (Sandbox Code Playgroud)

views.py

next = request.POST.get('next', '/')
return HttpResponseRedirect(next)
Run Code Online (Sandbox Code Playgroud)

django.contrib.auth如果我记得很清楚,这大致与登录表单有关.

如果您通过中间页面,则可以通过查询字符串传递"下一个"值:

some_page.html

<a href="{% url 'your_form_view' %}?next={{ request.path|urlencode }}">Go to my form!</a>
Run Code Online (Sandbox Code Playgroud)

template.html

<form method="POST">
    {% csrf_token %}
    {{ form }}
    <input type="hidden" name="next" value="{{ request.GET.next }}">
    <button type="submit">Let's Go</button>
</form>
Run Code Online (Sandbox Code Playgroud)

  • @Shahriar.M 是的,当然,您只需将“next={{ request.path|urlencode }}”查询参数传递到产品页面的 URL 即可。然后用 `href="{{ request.GET.next }}"` 制作后退按钮。 (2认同)

Sel*_*cuk 21

您可以使用以下HTTP_REFERER值:

return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))
Run Code Online (Sandbox Code Playgroud)

请注意,如果客户端禁用了发送引荐来源信息(例如,使用私有/隐身浏览器窗口),则此操作无效.在这种情况下,它将重定向到/.


Kou*_*Das 14

你可以用这个

return redirect(request.META.get('HTTP_REFERER'))
Run Code Online (Sandbox Code Playgroud)

确保导入这个

from django.shortcuts import redirect
Run Code Online (Sandbox Code Playgroud)


Fra*_*ank 5

我最喜欢的方法是将 request.path 作为 GET 参数提供给表单。发布时它会传递它,直到您重定向为止。在基于类的视图(FormView、UpdateView、DeleteView 或 CreateView)中,您可以直接将其用作 success_url。我在某个地方读到,混合使用 GET 和 POST 是不好的做法,但这种简单性对我来说是一个例外。


示例 url.py:

urlpatterns = [
    path('', HomeView.as_view(), name='home'),
    path('user/update/', UserUpdateView.as_view(), name='user_update'),
]
Run Code Online (Sandbox Code Playgroud)

链接到模板内的表单:

<a href="{% url 'user_update' %}?next={{ request.path }}">Update User</a>
Run Code Online (Sandbox Code Playgroud)

基于类的视图:

class UserUpdateView(UpdateView):
    ...
    def get_success_url(self):
        return self.request.GET.get('next', reverse('home'))
Run Code Online (Sandbox Code Playgroud)

在基于函数的视图中,您可以按如下方式使用它:

def createadv(request):
    uw = getuw(request.user.username)
    if request.method =='POST':
        form = AdverForm(request.POST, request.FILES)
        if form.is_valid():
            form.instance.user = request.user
            form.save()
            next = request.GET.get('next', reverse('home'))
            return HttpResponseRedirect(next)

    args = {}
    args.update(csrf(request))
    args['username'] = request.user.username
    args['form'] = AdverForm()
    args['uw'] = uw
    return  render_to_response('createadv.html', args)
Run Code Online (Sandbox Code Playgroud)