【问题标题】:Returning to page that brought you there Django返回将您带到那里的页面 Django
【发布时间】:2015-10-24 07:36:46
【问题描述】:

在 Python/Django 中,我有一个 FormView,允许您临时添加某些字段选择。

(示例:从汽水下拉菜单中选择汽水)

选择最喜欢的汽水:[_Soda_Choices_Dropdown_] +添加汽水

我希望能够即时添加苏打水,当我保存苏打水时,我希望成功 URL 成为将您带到那里的页面。

[第1页] --> [新建苏打FormView] --成功-> [第1页]

最好的方法是什么?

谢谢!

【问题讨论】:

    标签: python django formview


    【解决方案1】:

    编辑:

    最好在请求中使用next参数来重定向到购买我们的页面以形成页面,而不是使用HTTP_REFERER。

    假设您在页面 some_page.html 上具有指向 MySodaFormView 页面的链接。在这里,将request.path 作为next 参数传递。这将在重定向时使用。

    <a href='/my/soda/form/page/?next={{request.path}}'>Create new soda</a> 
    

    然后在MySodaFormView渲染页面时,在上下文中传递next参数。此参数将在form action 中传递,并在重定向时使用。

    在您的 soda formview 模板中,以 action 的形式指定 next 参数。

    <form method="POST" action="/my/soda/form/page/?next={{next_url}}">
    

    您的视图将类似于:

    class MySodaFormView(FormView):
    
        def get_context_data(self, **kwargs):
            context = super(MySodaFormView, self).get_context_data(**kwargs)
            context['next_url'] = self.request.GET.get('next') # pass `next` parameter received from previous page to the context 
            return context
    
        def get_success_url(self):
            next_url = self.request.GET.get('next')
            if next_url:
                return next_url # return next url for redirection
            return other_url # return some other url if next parameter not present
    

    编辑:以下使用 HTTP_REFERER 的方法有时可能不起作用,因为某些浏览器关闭了传递引用功能或为用户提供了禁用该功能的选项。

    要返回在那里购买您的页面,您可以使用HttpRequest.META 字典中的HTTP_REFERER 标头。

    HttpRequest.META 是一个标准的 Python 字典,包含所有可用的 HTTP 标头。其中一个标题是HTTP_REFERER,其中包含引用页面(如果有)。

    由于您使用的是FormView,因此您可以覆盖get_success_url() 函数以在成功时重定向到将用户购买到MySodaFormView 的页面。我们将使用request.META 字典中的HTTP_REFERER 的值来获取此页面。

    from django.views.generic.edit import FormView
    
    class MySodaFormView(FormView):
    
        def get_success_url(self):
            referer_url = self.request.META.get('HTTP_REFERER') # get the referer url from request's 'META' dictionary
            if referer_url:
                return referer_url # return referer url for redirection
            return other_url # return some other url if referer url not present
    

    注意:使用来自request.META 字典的HTTP_REFERER 可能不是“最佳实践”,因为某些浏览器已关闭传递引用功能或为用户提供禁用该功能的选项。在这种情况下,您的重定向将无法正常工作。您可以改为在 url 和 get_success_url() 函数中传递 ?next= 参数,使用 next 的值来获取要重定向到的 url。

    【讨论】:

    • 请详细说明。 Page 1 不是固定页面。用户可以根据问题从多个页面访问MySodaFormView页面。
    • 您是指用户到达表单,填写信息然后提交的这种情况。 HTTP_REFERER 是表单页面的 URL,而不是用户最初来自的页面的 URL
    【解决方案2】:
    def soda_view(request):
       # your code goes here
    
       url = "{0}/{1}".format(request.META.get('HTTP_REFERER', '/'), args)
    
       return HttpResponseRedirect(url)
    

    【讨论】:

    • 一般来说,没有解释的答案被认为对未来的观众来说是相对无用的。请edit您的回答包括解释。
    【解决方案3】:

    FormView 以及其他具有 FormMixin 的基于类的通用视图都有一个方法 get_success_url(),您可以使用该方法返回到同一页面。它看起来像这样:

    from django.core.urlresolvers import reverse
    
    def get_success_url(self):
        return reverse('url_name_of_page_1')
    

    或者,将其与 Geo Jacob 的答案结合起来,从 HTTP 标头中获取引用 URL:

    def get_success_url(self):
        if 'HTTP_REFERER' in request.META:
            return request.META['HTTP_REFERER']
        else:
            # Do something with the error case
    

    【讨论】:

      【解决方案4】:

      当您使用FormView 时,只需执行以下操作:

      from django.shortcuts import reverse
      
      class YourView(FormView):
          success_url = reverse('first-page')
      

      在你的urls.py:

      url(r'/foo/bar/', some.view, name='first-page'),
      

      first-page 是在图表中呈现Page 1 的视图的名称。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-19
        • 2019-05-25
        • 1970-01-01
        • 2016-07-14
        相关资源
        最近更新 更多