-2

編集市長は、明確にするために質問とテキストに変更を加えました。結局のところ、エラーは、HttpResponse を views.py にインポートするのを忘れたという非常に愚かな間違いによって引き起こされます。同じviews.pyで別のビューを扱っているので、それがインポートされたと仮定しました。新人ミス。:(

質問: ajax を介して賛成票または反対票を送信しようとしています。どうやら私のビューのほとんどのコードが実行され、応答を返すと失敗します。問題は、django によって表示されるエラーがないことです。ターミナルで得られる唯一の情報は次のとおりです: "POST /c/vote/ HTTP/1.1" 500 10814. /c/vote/ は、投票を処理する URL です。

Chrome のコンソールもあまり役に立ちません。「リソースの読み込みに失敗しました: サーバーは 500 のステータスで応答しました (INTERNAL SERVER ERROR)」というエラーが表示されます。リンクをクリックすると、django が 404 を返す /c/vote/ にリダイレクトされます別の URL で投票しています (つまり/c/<country>/)

投票が実際に保存または削除されていることがわかったので、応答を返すときに問題が発生する可能性があります。

私のテンプレート (ユーザーが以前に投票したかどうかを知るためのカスタム テンプレート タグ):

<div class="vote_buttons" x:id="{{linkpost.pk}}">
    <a href="#" class="upVote{% if linkpost|is_up_voted_by:user %} voted{%endif%}" x:value="1" ></a>
    <a href="#" class="downVote{% if linkpost|is_down_voted_by:user %} voted{%endif%}" x:value="-1"></a>

js コード (私は JQuery を使用しています)。変数 {{ vote_url }} はテンプレート タグで渡されます。

<script type="text/javascript">
    $(document).ready(function() {
        $(".vote_buttons").bind("vote", function(event, value) {
            var vote_el = $(this);
            $.ajax({
                    type:'POST',
                url: '{{ vote_url }}',
                data: {

                    'pk': vote_el.attr("x:id"),
                    'delta': value
                },
                dataType: "json",
        success : function(data, textStatus, jqXHR) {
                    switch (data.voted_as) {
                        case 1:
                            vote_el.find("a.upVote").addClass("voted");
                            vote_el.find("a.downVote").removeClass("voted");
                       break;
                        case -1:
                            vote_el.find("a.upVote").removeClass("voted");
                            vote_el.find("a.downVote").addClass("voted");
                       break;
                    }
                },
            });
        });
        $('.upVote, .downVote').click(function(){
            $(this).parent().trigger("vote", $(this).attr("x:value"));
            return false;
        });
    });
</script>

そして最後に景色。どこで失敗するかを把握するために、いくつかの印刷ステートメントを追加しました。@Steven のおかげで、コードはステップ 12 まで実行されます。その後、前述のエラーが発生します。

def vote(request):
    """
    Likes or dislikes a linkpost.
    """
    print "Setp 1 ok!"
    #User must be authenticated to vote.
    if request.is_ajax():
        print "Step 2 ok"
        if request.method == 'POST' and request.user.is_authenticated():
            print "Step 3 ok"
            delta = request.POST['delta']
            # In case an error occurrs with delta value
            try:
                delta = int(delta)
                print "Step 4 ok"
            except ValueError:
                print "Error was value error"
                return HttpResponse("{'success': 'false'}")

            # You can only vote upwards or downwards    
            if not delta in (1, -1):
                print "Error was in delta"
                return HttpResponse("{'success': 'false'}")
            print "Step 5 ok"
            #We check if the linkpost actually exists!
            LinkPost = get_model('company', 'LinkPost')
            try:
                linkpost = LinkPost.objects.get(pk=request.POST['pk'])
                print "Step 6 ok"
            except LinkPost.DoesNotExist:
                print "Link object does not exist"
                return HttpResponse("{'success': 'false'}")

            #We check if the user voted before.
            Vote = get_model('company', 'Vote')
            try:
                vote = Vote.objects.get(linkpost = linkpost, listener = request.user)
                print "Step 7 ok!" 
            except Vote.DoesNotExist:
                print "Vote doesn't exists!" 
                vote = None

            # If there is already a vote
            if vote:

                print "Step 8."
                if vote.delta == delta:
                    vote.delete()
                else:
                    print "Step 9."
                    vote.delta = delta
                    vote.save()

            #There wasn't a vote, we create one.
            else:
                print "Step 10."
                Vote.objects.create(linkpost = linkpost,
                                           listener = request.user,
                                           delta = request.POST['delta'])

            response_dict = {'success' : 'true', 'voted_as': delta}          
            print "Step 12."    
            return HttpResponse(simplejson.dumps(response_dict), mimetype="application/json")
        else:
            print "User not authenticated"
            raise Http404('What are you doing here?')
    else:
        print "Request isn't ajax"
        raise Http404('What are you doing here?')

問題を解決するための助けをいただければ幸いです。質問がまだ不明な場合は、できるだけ多くの情報を明確にするか、追加しようとします!

4

1 に答える 1

0

試す:

response_dict = "{'success' : 'true', 'voted_as': '%s'}" % (delta)

コードの%演算子の後に余分なsがあります。そのはず% (delta)

また、DEBUG = Trueが設定されていると仮定すると、ブラウザ開発ツールでDjangoの有益なエラーページが表示されることがわかります([ネットワーク]セクションを確認してください)。フォーマットがオフになっている可能性がありますが、それでもコードエラーにすばやく到達するのに役立ちます。


編集:以下に詳述するOP修正タイプミス:

これがあなたの質問のタイプミスではない場合:except Vote.DoesNotExists:

その後、あなたはより多くの運を持っているかもしれません:

except Vote.DoesNotExist:
于 2012-09-11T09:16:59.730 に答える