Django - 登录后在/ <url> /的NoReverseMatch

时间:2016-04-16 13:53:33

标签: django django-views django-allauth django-autocomplete-light

我正在使用django-allauth进行用户身份验证。登录后,用户必须被重定向到/hello/prehome/。'hello'是我的应用程序的名称,并且prehome的视图将用户重定向到主页视图以及用户ID。我在LOGIN_REDIRECT_URL下的settings.py文件中指定了提到的url。但是,当我使用注册的用户名和密码登录时,我一直收到错误 -

NoReverseMatch at /hello/prehome/
Reverse for 'homepage' with arguments '(None,)' and keyword arguments '{}' not found. 1 pattern(s) tried: ['hello/homepage/(?P<user_id>[0-9]+)/$']
...    
/app/hello/views.py in prehome
return HttpResponseRedirect(reverse('homepage',args=(user.id,)))

当我注册新用户时,页面会正常重定向到主页,但主页视图的“其他”部分会被执行。

以下是项目的片段 -

views.py

def register(request):
    if request.POST:
        form=RegistrationForm(request.POST)
        if form.is_valid():
            username=form.cleaned_data['username']
            password=form.cleaned_data['password']
            email=form.cleaned_data['email']
            user=User.objects.create_user(username=username,password=password,email=email)
            user.save()
            user=auth.authenticate(username=username,password=password)
            if user.is_active:
                auth.login(request,user)
                return HttpResponseRedirect(reverse('homepage',args=(request.user.id,)))
    else:
        form=RegistrationForm()
    return render(request,'hello/registration/register.html',{'form':form,})

def prehome(request):
    user=request.user
    return HttpResponseRedirect(reverse('homepage',args=(user.id,)))

def homepage(request,user_id):
    user=User.objects.get(id=user_id)
    if request.user.is_authenticated():
        if request.user.is_active:
            return render(request,'hello/userprofile/homepage.html',{'user':user,})
    else:
        return render(request,'hello/userprofile/error.html')

urls.py(在app的子目录中)

from django.conf.urls import include, url
from . import views
urlpatterns=[
url(r'^prehome/$',views.prehome,name='prehome'),
url(r'^homepage/(?P<user_id>[0-9]+)/$',views.homepage,name='homepage'),
]

urls.py(在项目文件夹中)

from django.conf.urls import include, url
from django.contrib import admin
admin.autodiscover()
from hello import views

urlpatterns = [
    url(r'^$',views.index,name='index'),
    url(r'^admin/',include(admin.site.urls)),
    url(r'^accounts/',include('allauth.urls')),
    url(r'^hello/',include('hello.urls')),
]

请帮忙。

2 个答案:

答案 0 :(得分:1)

这可能是一个语法错误。
我将返回声明从return HttpResponseRedirect(reverse('homepage',args=(request.user.id,)))改为了return HttpResponseRedirect(reverse('homepage',args=[request.user.id])),这很有效。但是,我不明白它出了什么问题,为什么在合并这个变化后它才有效。官方django文档使用先前的参数传递给函数的格式。

答案 1 :(得分:0)

您必须登录,因为无法与正则表达式匹配。