【问题标题】:Django and urls.py: How do I HttpResponseRedirect via a named url?Django 和 urls.py:如何通过命名 url 进行 HttpResponseRedirect?
【发布时间】:2010-11-15 13:54:58
【问题描述】:

我正在编写一个基于成员的 Web 应用程序,我需要能够在登录后重定向页面。我想在我的views.py文件中使用我的urls.py脚本中的命名url来登录应用程序,但我一生都无法弄清楚该怎么做。我有的是这样的:

def login(request): 
if request.session.has_key('user'):
    if request.session['user'] is not None:
        return HttpResponseRedirect('/path/to/page.html')

我想要完成的是:

def login(request): 
if request.session.has_key('user'):
    if request.session['user'] is not None:
        return HttpResponseRedirect url pageName

执行此操作时出现语法错误,有什么想法吗?

【问题讨论】:

    标签: python django redirect django-urls


    【解决方案1】:

    您需要使用reverse() utils 函数。

    from django.urls import reverse
    # or Django < 2.0 : from django.core.urlresolvers import reverse
    
    def myview(request):
        return HttpResponseRedirect(reverse('arch-summary', args=[1945]))
    

    args 满足您 url 正则表达式中的所有参数。您还可以通过传递字典来提供命名参数。

    【讨论】:

    • 太棒了,感谢您的帮助!我一定是在搜索 django 文档时都错了。
    • 这几天是from django.urls import reverse
    • @partofthething 我已更新答案以包含注释掉的导入
    【解决方案2】:

    写 if 语句的更简洁的方式是if request.session.get('user')。 has_key 现在已弃用,并且 .get() 返回 None (默认情况下,可通过传递第二个参数来更改)。 因此,将其与 Soviut 的回复结合起来:

    from django.core.urlresolvers import reverse
    
    def login(request): 
        if request.session.get('user'):
             return HttpResponseRedirect(reverse('my-named-url'))
    

    【讨论】:

      【解决方案3】:
      from django.core.urlresolvers import reverse
      from django.shortcuts import redirect
      
      def login(request):
          if request.session.get('user'):
              return redirect(reverse('name-of-url'))
      

      另见https://docs.djangoproject.com/en/dev/topics/http/urls/#reverse-resolution-of-urls

      【讨论】:

        【解决方案4】:

        来自Django 1.3 onwards(重定向方法隐式执行反向调用)的正确答案是:

        from django.shortcuts import redirect
        
        def login(request):
            if request.session.get('user'):
                return redirect('named_url')
        

        【讨论】:

        • 另外,如果您在项目中使用命名应用程序,则语法为 redirect('appName:urlName')
        猜你喜欢
        • 2014-05-05
        • 1970-01-01
        • 2011-09-24
        • 2018-11-15
        • 1970-01-01
        • 2014-05-08
        • 2013-07-22
        • 1970-01-01
        • 2010-12-28
        相关资源
        最近更新 更多