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

xoshrz7s  于 2023-05-19  发布在  Go
关注(0)|答案(7)|浏览(123)

我面临一个问题,我找不到解决办法。我在导航栏中有一个按钮,在所有页面上都可以使用,它是一个负责创建一些内容的按钮。
与按钮链接的视图:

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)

如果你能看到现在我总是重定向到主页'/'后创建的内容,但我想回到我发起的内容创建的页面。

ckocjqey

ckocjqey1#

您可以在表单中添加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>

views.py

next = request.POST.get('next', '/')
return HttpResponseRedirect(next)

如果我没记错的话,这大概就是django.contrib.auth对登录表单所做的。
如果你通过一个中间页面,你可以通过querystring传递'next'值:
some_page.html

<a href="{% url 'your_form_view' %}?next={{ request.path|urlencode }}">Go to my form!</a>

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>
5gfr0r5j

5gfr0r5j2#

您可以使用HTTP_REFERER值:

return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))

请注意,如果客户端禁用发送引用信息(例如,使用私有/匿名浏览器窗口),则此操作将不起作用。在这种情况下,它将重定向到/

wwodge7n

wwodge7n3#

你可以用这个

return redirect(request.META.get('HTTP_REFERER'))

确保导入此

from django.shortcuts import redirect
hjqgdpho

hjqgdpho4#

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

urlpatterns = [
    path('', HomeView.as_view(), name='home'),
    path('user/update/', UserUpdateView.as_view(), name='user_update'),
]

链接到模板中的表单:

<a href="{% url 'user_update' %}?next={{ request.path }}">Update User</a>

基于类的视图:

class UserUpdateView(UpdateView):
    ...
    def get_success_url(self):
        return self.request.GET.get('next', reverse('home'))

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

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)
anauzrmj

anauzrmj5#

你可以用一个简单的一行程序JS轻松地做到这一点

<button onclick="history.back()">Go Back</button>

这将带您返回到历史记录列表的上一页。如果您没有历史https://www.w3schools.com/jsref/met_his_back.asp

ux6nzvsh

ux6nzvsh6#

使用HTTP_REFERER值:
1.用于func return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))
1.用于模板<a href="{{request.META.HTTP_REFERER}}">Go Back</a>

sdnqo3pr

sdnqo3pr7#

如果这有助于某人,我得到了这个在基于类的UpdateView中工作
模板

<form class="form" method="POST">
    {% csrf_token %}

    <!-- hidden form field -->
    <input type="hidden" id="previous_page" name="previous_page" 
    value="/previous/page/url">

    <!-- any other form fields -->
    {{ form.name|as_crispy_field }}
    {{ form.address|as_crispy_field }}

    <!-- form submit button -->
    <button class="btn btn-primary" type="submit" id="submit">Submit</button>
</form>

<!-- JS to insert previous page url in hidden input field -->
<script>
    prev = document.getElementById("previous_page");
    prev.value = document.referrer;
</script>

views.py

class ArticleUpdateView(generic.UpdateView):

    model = Article
    form_class = ArticleForm
    template_name = 'repo/article_form.html'

    def form_valid(self, form):
        form.instance.author = self.request.user
        # if form is valid get url of previous page from hidden input field
        # and assign to success url
        self.success_url = self.request.POST.get('previous_page')
        return super().form_valid(form)

视图现在会将您重定向回您单击“更新/编辑”按钮的页面。任何URL查询参数也被保留。

相关问题