django - 重定向 Django View

标签 django redirect registration reverse profile

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

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

这是用户登录的 View ,然后将用户重定向到配置文件:

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', {})

这是用户个人资料的 View :

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

有人可以告诉我如何将登录用户重定向到他们的个人资料吗?

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

用户配置文件匹配查询不存在。

这是回溯:

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.

最佳答案

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

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

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

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

@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 View 中,如果用户登录后不存在,您可以尝试创建 UserProfile:

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

关于django - 重定向 Django View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31899514/

相关文章:

python - 运行 for 循环获取图像时不显示图像

django - 为什么 TinyMCE 在 (django) {% %} 标签之间插入 <span> </span>?

django - 使用 django 中的 "extra fields "与额外字段的多对多关系

C++交叉初始化错误

c++ - 如何使用自定义注册系统注册 dll 并查看导入的 dll 的可执行文件的 PE?

django - django-tastypie 和 djangorestframework 有什么区别?

c# - 如何在 win64 上禁用重定向

java - 从类重定向到 gsp 页面

redirect - 导入未解析 : Mechanize

django - 移动应用程序的社交登录以使用 django-allauth