0

我试图让用户在退出时收藏视频。我正在使用@login_required 强制用户登录,将视频保存到他们的帐户,然后重定向回他们所在的页面。我收到一条错误消息

UnboundLocalError at /loggedout_fav/
local variable 'video' referenced before assignment

在loggedout_fav 下的返回行上。我在视图中放置了一条打印语句,但也没有任何内容打印到控制台。关于如何解决它的任何建议?

html

<form method = 'post' action = '/loggedout_fav/'> {% csrf_token %}
    <input type="hidden" value="{{video}}" name = "video_add_loggedout"/>
    <input type='submit' value='Login to plate this video'/>
</form>

网址

url(r'^loggedout_fav/', 'loggedout_fav'),

看法

def loggedout_fav(request):
    if 'video_add_loggedout' in request.POST:
        video = request.POST['video_add_loggedout']
        print video
        print 'test'
        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}))

def trending_video_player(request,author,video):
    ...
4

3 回答 3

0

我相信jpic所说的很可能是问题所在。我发布了一个单独的答案来澄清这个问题: UnboundLocalError 是一个 python 错误,这意味着在你的代码中的某处你在定义它之前访问了一个变量。

在您的“loggedout_fav”视图代码中,我看到您尝试访问最后一行中的“video”变量。当if 'video_add_loggedout' in request.POST语句不为 True(因此嵌套块未执行)时,'video' 变量将不会被初始化并且会引发此异常。实际上,这意味着您尝试访问您的视图而不发布“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']}))

上面还演示了如何使用该get_or_create方法稍微清理代码。

于 2012-11-20T23:27:25.290 回答
0

将值保存到会话。https://docs.djangoproject.com/en/dev/topics/http/sessions/

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

于 2012-11-20T23:03:11.453 回答
0

您使用了 'id' 而不是 'name' !所以这永远不是真的:

if 'video_add_loggedout' in request.POST:

并且video永远不会设置,所以它会窒息(你应该已经发布了堆栈跟踪 BTW,我不得不扭转它):

return HttpResponseRedirect(reverse('reserve.views.trending_video_player', kwargs={'author':'youtube', 'video':video}))

首先,您可以修复您的 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"/>
于 2012-11-20T21:10:13.237 回答