Django 和 urls.py:如何通过命名 url 进行 HttpResponseRedirect?
Posted
技术标签:
【中文标题】Django 和 urls.py:如何通过命名 url 进行 HttpResponseRedirect?【英文标题】:Django and urls.py: How do I HttpResponseRedirect via a named url? 【发布时间】: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
执行此操作时出现语法错误,有什么想法吗?
【问题讨论】:
【参考方案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')
以上是关于Django 和 urls.py:如何通过命名 url 进行 HttpResponseRedirect?的主要内容,如果未能解决你的问题,请参考以下文章
如何让 Django urls.py 识别 url 中的 # (hash)?