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

2024-04-25 22:51:24 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

在loggedout\u fav下的回流线上。我在视图中放置了一个print语句,但是控制台也没有任何内容被打印。有什么建议吗?在

html格式

^{pr2}$

网址

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

Tags: 用户add视图视频youtuberequestdefvideo
3条回答

我相信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方法清理代码。在

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

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

你用了'id'而不是'name'!所以这不是真的:

if 'video_add_loggedout' in request.POST:

而且video从未设置过,所以它阻塞了(顺便说一句,您应该发布stacktrace,我不得不将其反转):

^{pr2}$

首先,您可以修复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"/>

相关问题 更多 >