【问题标题】:Redirect a Django view重定向 Django 视图
【发布时间】:2015-11-01 04:25:29
【问题描述】:

用户登录我的应用后,我想将该人重定向到他们的个人资料。
但是,我不断收到此错误:

/app/url/username/处的类型错误
profile() 得到了一个意外的关键字参数“用户名”

这是模型:

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(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.

【问题讨论】:

    标签: django redirect registration reverse profile


    【解决方案1】:

    我在您的代码中发现了两个可能的问题:

    第一个,在user_login函数中,当使用reverse()创建用于重定向的url时,你应该在args中传递username值而不是kwargs

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

    第二件事,您似乎将配置文件网址中的参数命名为username,这意味着它将被传递到具有相同名称的相应视图函数中,因此您应该在视图中将user重命名为username并更新您的逻辑如下:

    @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)
                ...
        ...
    

    【讨论】:

    • 好的,我尝试了你的方法,得到了这个错误:UserProfile 匹配查询不存在。
    • @user2901792 您确定在新用户注册时创建UserProfile 对象吗?对于每个新的User,也应该创建一个新的UserProfile 对象。
    • 我是个新手@ozgur。新用户注册时如何创建 UserProfile 对象?感谢您的回复。
    【解决方案2】:

    您的 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})
    

    【讨论】:

      猜你喜欢
      • 2021-09-25
      • 1970-01-01
      • 2018-05-20
      • 2017-11-19
      • 2018-04-25
      • 2020-01-01
      • 2012-03-10
      • 2018-10-21
      • 2021-04-16
      相关资源
      最近更新 更多