Python 在使用django登录后,如何在传递变量并保存到数据库时重定向?

Python 在使用django登录后,如何在传递变量并保存到数据库时重定向?,python,django,redirect,httpresponse,Python,Django,Redirect,Httpresponse,我正在尝试允许用户在注销时收藏视频。我使用@login\u required强制用户登录,将视频保存到他们的帐户,然后重定向回他们所在的页面。我听到一个错误,说 UnboundLocalError at /loggedout_fav/ local variable 'video' referenced before assignment 在loggedout_fav下的回流线上。我在视图中放置了一个print语句,但也没有任何内容打印到控制台。关于如何修复它有什么建议吗 html 看法 你用了

我正在尝试允许用户在注销时收藏视频。我使用@login\u required强制用户登录,将视频保存到他们的帐户,然后重定向回他们所在的页面。我听到一个错误,说

UnboundLocalError at /loggedout_fav/
local variable 'video' referenced before assignment
在loggedout_fav下的回流线上。我在视图中放置了一个print语句,但也没有任何内容打印到控制台。关于如何修复它有什么建议吗

html 看法
你用了“id”而不是“name”!所以这从来都不是真的:

if 'video_add_loggedout' in request.POST:
而且
video
从未设置过,所以它会阻塞(顺便说一句,你应该发布stacktrace,我不得不反转):

第一件事优先您可以修复Python,如下所示:

def loggedout_fav(request):
    if 'video_add_loggedout' not in request.POST:
        return HttpResponseBadRequest()

    video = request.POST['video_add_loggedout']
    try:
        s = Everything.objects.get(profile = request.user, video = request.POST['video_add_loggedout'], playlist = 'Favorites', platform = 'youtube')
        print "already exists"
    except:
        p = Everything(profile = request.user, video = request.POST['video_add_loggedout'], playlist = 'Favorites', platform = 'youtube')
        p.save()
    return HttpResponseRedirect(reverse('reserve.views.trending_video_player', kwargs={'author':'youtube', 'video':video}))
当然,也要修复HTM,这是:

<input type="hidden" value="{{video}}" id = "video_add_loggedout"/>

应该是:

<input type="hidden" value="{{video}}" name="video_add_loggedout"/>

将值保存到会话中


确保在用户登录之前获取会话中的值,这样就不会丢失这些值。

我相信jpic所说的可能就是问题所在。我给出了一个单独的答案来澄清这个问题:UnboundLocalError是一个python错误,这意味着在定义变量之前,您可以在代码中的某个地方访问它

在“loggedout_fav”视图代码中,我看到您试图访问最后一行中的“video”变量。如果request.POST中的
if'video\u add\u loggedout'语句不正确(因此嵌套块未执行),则不会初始化'video'变量,并引发此异常。实际上,这意味着您尝试访问视图而不发布“video\u add\u loggedout”变量。我将把这一观点重新组织如下:

def loggedout_fav(request):
    try:
        Everything.objects.get_or_create(profile=request.user, video=request.POST['video_add_loggedout'], playlist='Favorites', platform='youtube')
    except KeyError:
        #do something when the variable is not set. eg:
        return HttpResponseBadRequest()
    return HttpResponseRedirect(reverse('reserve.views.trending_video_player', kwargs={'author':'youtube', 'video':request.POST['video_add_loggedout']}))

上面还演示了如何使用
get\u或\u create
方法稍微清理代码。

我将代码从id改为name,但仍然会遇到相同的错误。我想我是通过“video=request.POST['video\u add\u loggedout']”设置视频变量的。在控制台中,我没有看到打印的变量,但看到了POST/accounts/login/HTTP/1.1和GET/loggedout\u fav/HTTP/1.1" 500 66320. 我可以以用户身份登录,但无法访问实际视图。我不知道该说什么。在您发表评论之前的2分钟内,您似乎无法阅读我的所有答案:0。你的python仍然是坏的,1。您没有发布错误和2的堆栈跟踪。你的评论很隐晦。
def loggedout_fav(request):
    if 'video_add_loggedout' not in request.POST:
        return HttpResponseBadRequest()

    video = request.POST['video_add_loggedout']
    try:
        s = Everything.objects.get(profile = request.user, video = request.POST['video_add_loggedout'], playlist = 'Favorites', platform = 'youtube')
        print "already exists"
    except:
        p = Everything(profile = request.user, video = request.POST['video_add_loggedout'], playlist = 'Favorites', platform = 'youtube')
        p.save()
    return HttpResponseRedirect(reverse('reserve.views.trending_video_player', kwargs={'author':'youtube', 'video':video}))
<input type="hidden" value="{{video}}" id = "video_add_loggedout"/>
<input type="hidden" value="{{video}}" name="video_add_loggedout"/>
def loggedout_fav(request):
    try:
        Everything.objects.get_or_create(profile=request.user, video=request.POST['video_add_loggedout'], playlist='Favorites', platform='youtube')
    except KeyError:
        #do something when the variable is not set. eg:
        return HttpResponseBadRequest()
    return HttpResponseRedirect(reverse('reserve.views.trending_video_player', kwargs={'author':'youtube', 'video':request.POST['video_add_loggedout']}))