我正在创建一个django项目。但是,我遇到了一个小小的打嗝。我的urls.py看起来像这样
url(r'^login/(?P<nextLoc>)$', 'Home.views.login'),
url(r'^logout/$', 'Home.views.logout'),
Home应用中的我的views.py如下:
def login(request,nextLoc):
if request.method == "POST":
form = AuthenticationForm(request.POST)
user=auth.authenticate(username=request.POST['username'],password=request.POST['password'])
if user is not None:
if user.is_active:
auth.login(request, user)
return redirect(nextLoc)
else:
error='This account has been disabled by the administrator. Contact the administrator for enabling the said account'
else:
error='The username/password pair is incorrect. Check your credentials and try again.'
else:
if request.user.is_authenticated():
return redirect("/profile/")
form = AuthenticationForm()
error=''
return render_to_response('login.html',{'FORM':form,'ERROR':error},context_instance=RequestContext(request))
def logout(request):
auth.logout(request)
return redirect('/')
现在,当我要进入登录页面时,它正按预期打开。提交表单后,我收到一条错误消息,指出它无法找到模块URL。在挖掘了一下之后,我注意到重定向(“/”)实际上转换为http://localhost/login/
而不是http://localhost/
。注销时也是如此,即尝试打开网址http://localhost/logout/
而不是http://localhost/
。基本上,当打开页面为http://localhost/login
时,redirect('/')
会将/添加到当前网址的末尾,并且瞧 - 我得到了一个我没想到的网址 - http://localhost/login/
。我无法使用重定向将其重定向到网站的根目录。
请帮助我解决这个问题,如果可能的话还要解释Django这种不合理行为的原因
答案 0 :(得分:5)
如果您查看documentation for redirect,可以将一些内容传递给该函数:
一般来说,我认为最好重定向到视图名称而不是URL。在您的情况下,假设您的urls.py有一个类似于以下内容的条目:
url(r'^$', 'Home.views.index'),
我会改用这样的重定向:
redirect('Home.views.index')
答案 1 :(得分:5)
我正在使用Django 3.1。这是我要做的事情:
在urls.py
from django.shortcuts import redirect
urlpatterns = [
path('', lambda req: redirect('/myapp/')),
path('admin/', admin.site.urls),
path('myapp/', include('myapp.urls'))
]