0

ユーザーがサインアウトしている間、ビデオをお気に入りに追加できるようにしようとしています。@login_required を使用して、ユーザーにサインインを強制し、ビデオをアカウントに保存してから、元のページにリダイレクトします。というエラーが表示されます

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

Loggedout_fav の下の戻り行。ビューに print ステートメントを入れましたが、コンソールにも何も出力されません。それを修正する方法について何かアドバイスはありますか?

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

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

値をセッションに保存します。https://docs.djangoproject.com/en/dev/topics/http/sessions/

ユーザーがログインする前に、セッションで値を取得して、値が失われないようにしてください。

于 2012-11-20T23:03:11.453 に答える
0

「name」の代わりに「id」を使用しました! したがって、これは決して真ではありません:

if 'video_add_loggedout' in request.POST:

そしてvideo、決して設定されないので、チョークします(ところで、スタックトレースを投稿する必要がありました。私はそれを逆にする必要がありました):

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 に答える
0

jpicが言ったことは問題かもしれないと私は信じています。問題を明確にするために別の回答を投稿します。 UnboundLocalError は、コードのどこかで変数を定義する前に変数にアクセスすることを意味する Python エラーです。

「loggedout_fav」ビュー コードでは、最後の行で「video」変数にアクセスしようとしていることがわかります。ステートメントが Trueでif 'video_add_loggedout' in request.POSTない (したがってネストされたブロックが実行されない) 場合、'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 に答える