Python / Django - 如何在导航到新视图之前获取页面URL

时间:2017-05-24 07:10:05

标签: python django url

我有一个链接到网址的链接,如下所示:

<a href="{% url 'sign_in' %}" title="Click here to sign in">Sign in</a>

这链接到Django中的新视图,我的URL模式如下所示:

url(r'^sign-in/', sign_in, name="sign_in")

在我的sign_in视图中,我希望能够访问用户最初点击该链接的网址。具体来说,我想将此URL添加一个名为returnUrl的参数到新URL。然后,我的sign_in视图可以重定向到此新网址,相应的视图可以访问returnUrl参数。

例如:

  1. 用户点击“登录”
  2. 网站导航至example.com/sign-in/
  3. sign_in视图重定向到sign_in_page,将步骤1中的网址添加为参数。
  4. sign_in_page可以访问网址参数。
  5. 如何在Django中实现这一目标?我的观点看起来像这样......

    from django.http import HttpResponse
    from django.shortcuts import render, redirect
    from django.core.urlresolvers import reverse
    from django.http import HttpResponseRedirect
    from django.core.urlresolvers import resolve
    
    
    def sign_in(request):
        # I need the original URL the user came from here 
        # to add it as `returnUrl` below:
        return HttpResponseRedirect(reverse('sign_in_page') + '?returnUrl=example.com/whatever')
    
    
    def sign_in_page(request):
        return render(request, 'sign-in.html')
    

    如果我使用重定向我走错了路,请告诉我。对我来说,它似乎是添加URL参数的唯一方法 - 这对我的实现很重要。如果你知道如何在没有重定向的情况下做到这一点 - 请告诉我!

3 个答案:

答案 0 :(得分:2)

如果要在视图之间传递数据,可以使用POST数据或GET。在您的情况下,GET数据就是您想要的。 所以你应该使用以下网址。

"{% url 'sign_in' %}?returnUrl={{request.path}}"

然后在你看来:

  1. 检查是否已发送GET变量'returnUrl'
  2. 重定向到下一个网址
  3. 其他重定向到默认页面
  4. 在以下示例中,我使用从FormView继承的基于类的View

    def get_success_url(self):
        if self.request.GET.get('next', ''):
            return (self.request.GET.get('next', ''))
        return  reverse_lazy('experiment_list')
    

    注意:请确保在设置中包含以下内容,以确保在每个模板中获得request.path变量:

    ## example: settings.py
    TEMPLATE_CONTEXT_PROCESSORS = (
        # other items...
        'django.core.context_processors.request',
        # other items...
    )
    

答案 1 :(得分:1)

referer = self.request.META.get('HTTP_REFERER')

在您需要获取上一个网址的视图中尝试此操作,希望这是您正在寻找的内容

答案 2 :(得分:0)

如果您想重定向到referer,那么您可以尝试这样

    from django.http import HttpResponseRedirect

    def sign_in(request):
       # Do your logic here
       return HttpResponseRedirect(request.META.get('HTTP_REFERER'))