2015-08-08 47 views
2

用户登录到我的应用程序后,我想将该人重定向到他们的个人资料。
不过,我不断收到此错误:重定向Django视图

TypeError at /app/url/username/
profile() got an unexpected keyword argument 'username'

这里是模型:

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    profile_picture = models.ImageField(upload_to='profile_images', blank = True) 

     def __str__(self): 
      return self.user.username 

这里就是用户将登录,然后将用户重定向到配置文件中的观点:

def user_login(request): 


    if request.method == 'POST': 
     username = request.POST.get('username') 
     password = request.POST.get('password') 

     user = authenticate(username=username, password=password) 

     if user: 
      if user.is_active: 
       login(request, user) 

       url = reverse('profile', kwargs={'username': username}) 
      return redirect(url) 

      else: 
       return HttpResponse("Please login.") 

     else: 
      print("Invalid login details: {0}, {1}".format(username, password)) 
      return HttpResponse("Invalid login details supplied.") 

    else: 
     return render(request, 'reviews/login.html', {}) 

下面是用户简档的视图:

@login_required 
def profile(request, user): 
    user = UserProfile.objects.get(user = request.user) 
    return render(request, 'reviews/profile.html', {'username':username}) 

下面是URL模式:

url(r'^profile/(?P<username>\w+)/$', views.profile, name='profile') 

有人能告诉我如何登录的用户他们的个人资料重定向?

尝试了两种方法到目前为止建议。我收到了这两个错误:

UserProfile匹配查询不存在。

这里是回溯:

Environment: 


Request Method: GET 
Request URL: http://localhost:8000/app/profile/username/ 

Django Version: 1.8.3 
Python Version: 3.4.3 
Installed Applications: 
('grappelli', 
'django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'reviews', 
'compressor', 
'cloudinary') 
Installed Middleware: 
('django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
    'django.middleware.security.SecurityMiddleware') 


Traceback: 
File "/var/www/nurse/lib/python3.4/site- packages/django/core/handlers/base.py" in get_response 
132.      response = wrapped_callback(request, *callback_args, **callback_kwargs) 
File "/var/www/nurse/lib/python3.4/site- packages/django/contrib/auth/decorators.py" in _wrapped_view 
22.     return view_func(request, *args, **kwargs) 
File "/var/www/nurse/nurseapp/reviews/views.py" in profile 
165.  user=UserProfile.objects.get(user = request.user)      
File "/var/www/nurse/lib/python3.4/site-packages/django/db/models/manager.py" in manager_method 127.     return getattr(self.get_queryset(), name)(*args, **kwargs) 
File "/var/www/nurse/lib/python3.4/site-packages/django/db/models/query.py" in get 334.     self.model._meta.object_name 

Exception Type: DoesNotExist at /app/profile/username/ 
Exception Value: UserProfile matching query does not exist. 

回答

2

我看到你的代码可能存在两个问题:

首先一个,在user_login功能创建使用reverse()重定向URL时,你应该在args通过username值而不是kwargs

url = reverse('profile', args=(username,)) 

第二件事,看起来你命名在个人资料网址参数为username,这意味着它会被传递到相应的视图功能具有相同的名称,所以你应该考虑重新命名userusername和更新你的逻辑如下:

@login_required 
def profile(request, username): 
    p = UserProfile.objects.get(user__username=username) 
    return render(request, 'reviews/profile.html', 
     {'username': username, 'user': p.user, 'profile': p}) 

请注意,对于每个User对象,必须有一个对应于它的UserProfile。如果新用户注册后不创建UserProfile对象,你可以尝试发送User对象到你的模版。

@login_required 
def profile(request, username): 
    user = User.objects.get(username=username) 
    return render(request, 'reviews/profile.html', 
     {'username': username, 'user': user}) 

这是一个不好的做法,但在user_login视图,你可以尝试,如果创建UserProfile用户登录后不存在:

def user_login(request): 
    ... 
    user = authenticate(username=username, password=password) 
    if user: 
     if user.is_active: 
      UserProfile.objects.get_or_create(user=user) 
      ... 
    ... 
+0

好吧,我试过你的方法,并得到这个错误:UserProfile匹配查询不存在。 – user2901792

+0

@ user2901792您是否确定在新用户注册时创建了'UserProfile'对象?对于每个新的User,都应该创建一个新的UserProfile对象。 – ozgur

+0

我有点新手@ozgur。新用户注册时如何创建UserProfile对象?感谢您的回应。 – user2901792

1

您的veiw和正则表达式不匹配。将用户参数更改为用户名,并且我还将您的上下文更改为包含正确的变量。我还将您的重定向改为HttpResponseRedirect,因为它更容易。您不需要更改其他任何东西。但如果您需要更多帮助,请随时发表评论。

from django.views.shortcuts import HttpResponseRedirect 

def user_login(request): 
    if request.method == 'POST': 
     username = request.POST.get('username') 
     password = request.POST.get('password') 
     user = authenticate(username=username, password=password) 
     if user: 
      if user.is_active: 
       login(request, user) 
       return HttpResponseRedirect('/profile/{0}/').format(username) 
      else: 
       return HttpResponse("Please login.") 
     else: 
     print("Invalid login details: {0}, {1}".format(username, password)) 
     return HttpResponse("Invalid login details supplied.") 
    else: 
     return render(request, 'reviews/login.html', {}) 

@login_required 
def profile(request, username): 
    user=User.objects.get(user = request.user)      
    return render(request, 'reviews/profile.html', {'username':user})