2015-08-08 48 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})