2011-03-16 17 views
0

これは私の2番目のAjax入門であり、これをどうやって解消するかははっきりしていません。Ajaxでユーザーにログインする...コールバック関数が機能しない

私は匿名ユーザーが特定のタスクを実行しようとすると開くモーダルウィンドウを持っています。このウィンドウには、私のDjangoログインビューに$ .postというユーザーサインアップフォームが含まれています。ユーザー名/パスワードが有効な場合、ユーザーはステータスコード1でログインして応答として返されます。そうでない場合は、0のステータスが返されます。

私はjsの外でそれをしようとすると、動作します。しかし、私のスクリプトの中では失敗します。私はそれがcontent_typeのレスポンスとどのように関係していると思いますか?よく分かりません。

def login_async(request):  
if request.method=='POST' and len(request.POST['username'])<20 and len(request.POST['password'])<20: 
    username=request.POST.get('username', '') #probably need to script tags here 
    password=request.POST.get('password', '') 
    user=auth.authenticate(username=username, password=password) 
    if user is not None: 
     auth.login(request,user) 
     status=1 
     response=HttpResponse() 
     response['Content_Type']="text/html" 
     response.write(status) 
     return response 
    else: 
     status=0 
     response=HttpResponse() 
     response['Content_Type']="text/html" 
     response.write(status) 
     return response 




$('input#login').click(function(event){ 
    $.post("/login_async/", {username:$('input[name=username]').val(), password:$('input[name=password]').val()}, //could also use $(this).serialize() here to capture all form inputs 
     function(data){ 
      if(data==1){ 
       $('#login').dialog("close"); 
       } 
    }); 
    }); 

ここで問題は何ですか?私は最初JSONとして応答を返そうとしましたが、serialize.serializers( "json"、status)を動作させる方法を理解できませんでした。私は間違いを続けた。

一つの最後の質問...

私は、ページ上のモーダルウィンドウの動作に影響を与える有効なステータスを(ユーザーがサインインしている)、取得した場合。モーダルウィンドウは、ログイン状態に基づいて開きます。ユーザーがログインしている場合は、クリックイベントでウィンドウが開き、その逆もあります。このトグルはDjangoコンテキスト{%user.is_authenticated%}に依存します。

ページの読み込み時に、そのコンテキストは1回だけ右にレンダリングされますか?状態の変更を簡単なハッキングから安全なモーダルウィンドウに伝えるために何かできますか?

+0

「/ login_async」にURLを変更してみてください。また、コンソールを見ましたか?リクエストの失敗と成功のイベントハンドラを作成して、リクエストが失敗したかどうかを知るためにアラートが表示されるようにします。 – mattsven

答えて

1

Content-Typeである必要があります。それでも問題が解決しない場合は、$.postコールの最後にdataTypeパラメータを追加してみてください。

$.post("/login_async/", {}, function(data){ 
    // fancy stuff 
}, "html"); 
+0

ええ、トリックをするように見えた感謝haochi。私の大きな疑問は依然として残っています。私は今ユーザにログインしましたが、その事実を{%if user.is_authenticated%} djangoコンテキスト変数によって指示されるモーダルウィンドウにどのように伝えるかわかりません。 – Ben

+0

@Brendan 'var user_logged_in = {%user.is_authenticated%};'と呼ばれるグローバルスコープの中に住んでいます。ログイン処理後、変数を応答で更新するだけです。あなたのイベントハンドラで 'if(user_logged_in){} else {}' – Haochi

0

うん、私はもっと上で、それを考えて、私はちょうどモーダルウィンドウ上の既存のクリックイベントハンドラをバインド解除してからAjaxの応答に応じて、新しいイベントハンドラをバインドしなければならないことに気づきました。

私はプログラミングが大好きです

関連する問題