12

私は Ajax に比較的慣れていないので、まだすべての概念を理解しようとしています。私は Ajax-Django フォーム送信に関する一連のチュートリアルを調べようとしましたが、それらのほとんどは jQuery フォームを必要とし、フォーム送信を処理する簡単な方法とは思えません。概念を理解するのに苦労しています。

ユーザー登録、ログイン、投稿作成、コメント用の ajax ベースのフォーム送信を作成しようとしています。そして、これまでのところ、Ajax アプローチがどのように機能するかを簡単に理解できるようにする方法を見つけていません。

この点で私が得ることができる助けを本当に感謝します.

これは私がこれまでに試したことです。

change_pw.html

{% extends "base.html" %}
    {% block title %}Change Password{% endblock %}
    {% block head %}Change Password{% endblock %}
    {% block content %}
    {% include "modal_change_pw.html" %}
    {% endblock %}

modal_change_pw.html

<div id="modalchangepw">
<ul style="margin:5px;">
    <ul class="thumbnails" style="margin: 0 auto;background: white;">
        <div class="thumbnail row-fluid" style="background: white; padding: 10px;width: 97%; -moz-border-radius: 5px;border-radius: 5px;-moz-box-shadow:3px 3px 5px 0px #ccc;-webkit-box-shadow:3px 3px 5px 0px #ccc;box-shadow:3px 3px 5px 0px #ccc;">
            <br>
            {% if not error == '' %}
                <div class="alert alert-error">
                    <button type="button" class="close" data-dismiss="alert">&times;</button>
                    {{ error }}
                </div>
            {% endif %}
            {% if not success == '' %}
                <div class="alert alert-success">
                    <button type="button" class="close" data-dismiss="alert">&times;</button>
                    {{ success }}
                </div>
            {% endif %}
            {% if messages %}
                {% for message in messages %}
                  <div{% if message.tags %} class="alert alert-{{ message.tags }}"{% endif %}>
                    <button type="button" class="close" data-dismiss="alert">&times;</button>
                    {{ message|safe }}
                  </div>
                {% endfor %}
            {% endif %}
            <form id = 'changepw' enctype="multipart/form-data" method="post" action=".">
                <p><label for="id_currentpw">Current Password:</label> <input type="password" name="currentpw" id="id_currentpw" /></p>
                <p><label for="id_newpw1">New Password:</label> <input type="password" name="newpw1" id="id_newpw1" /></p>
                <p><label for="id_newpw2">Re-enter New Password:</label> <input type="password" name="newpw2" id="id_newpw2" /></p>
                <input class="btn btn-primary" type="submit" value="submit"/>
                {% csrf_token %}
            </form>
        </div>
    </ul>
</ul>
</div>

ビュー.py

def change_pw(request):
    user=request.user
    error=''
    success=''
    if request.method == 'POST':
        form = ChangePw(request.POST)
        if form.is_valid():
            currentpw=form.cleaned_data['currentpw']
            newpw1=form.cleaned_data['newpw1']
            newpw2=form.cleaned_data['newpw2']
            if currentpw and newpw1 and newpw2:
                if user.check_password(currentpw):
                    if newpw1==newpw2:
                        user.set_password(newpw1)
                        user.save()
                        success='Password updated!!'
                        if request.is_ajax() :
                            messages.success(request, 'Password updated.')
                            return HttpResponseRedirect ('/changepw/')
                        else:
                            return HttpResponseRedirect ('/user/%s/' % user.username)
                    else:
                        error='New passwords do not match'
                else:
                    error='Incorrect Current Password'
            else:
                error='Enter all Password fields to make any changes' 
    else:
        form = ChangePw()
    variables = RequestContext(request, {
           'form':form,
           'error':error,
           'success':success
    })
    if request.is_ajax() :
         return render_to_response('modal_change_pw.html', variables)
    else:    
        return render_to_response('change_pw.html', variables)

フォーム.py

class ChangePw(forms.Form):
     currentpw = forms.CharField(
        label=u'Current Password',
        required=False,
        widget=forms.PasswordInput()
     )
     newpw1 = forms.CharField(
        label=u'New Password',
        required=False,
        widget=forms.PasswordInput()
     )
     newpw2 = forms.CharField(
        label=u'Re-enter New Password',
        required=False,
        widget=forms.PasswordInput()
     )

jQuery

//Change PW
        $('#changepw').live('submit', function(event) { // catch the form's submit event
          event.preventDefault();
          $.ajax({ // create an AJAX call...
              data: $(this).serialize(), // get the form data
              type: $(this).attr('method'), // GET or POST
              url: $(this).attr('action'), // the file to call
              success: function(response) { // on success..
                  $('#modalchangepw').html(response); // update the DIV
              }
          });
          return false;
        });

コードは現在正常に動作しているようです。しかし、私の目的は、これらのフォームをモーダル ポップアップ方式で処理して、ユーザーが現在表示しているページを離れる必要がないようにすることです。モーダル ポップアップの場合、フォームが値を送信していないようです。

4

2 に答える 2

37

このAJAX概念は、一般的なフォーム送信の仕組みと大差ありません。AJAX の背後にある考え方は、データを非同期的にサーバーに送信 (渡す) することです。

使い方?

一般的なフォーム送信では、フローは次のようになります。

User submits a POST request
               ↓
Server Does the Data Processing
               ↓
Redirects to a Success or Failure Page

ajax を使用すると、ほぼ同じように機能します。

User Submits a form through AJAX
               ↓
AJAX sends the POST data to the server in the background and waits for a response
               ↓
Server does the Data Processing
               ↓
and sends a Response back to AJAX
               ↓
AJAX sends the response back to the same template where the request was initiated.

それでは、django ビューを使用した単純な Ajax ログインを見てみましょう。

ビュー.py

def ajax_login(request):
    """  
    This view logs a user in using the POST data.
    """

    if request.method == 'POST':
        data = {}
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username=username, password=password)
        if (not user is None) and (user.is_active):
            login(request, user)
            # Set Session Expiry to 0 if user clicks "Remember Me"
            if not request.POST.get('rem', None):
                request.session.set_expiry(0)
            data['success'] = "You have been successfully Logged In"
        else:
            data['error'] = "There was an error logging you in. Please Try again"
        return HttpResponse(simplejson.dumps(data), mimetype="application/json")

上記のビューでは、データ処理を行い、JSON 応答を返しました。ajax メソッドは次のようになります。

function ajaxLogin(){
    var dataString = '&username=' + $('input[name=username]').val() +
                     '&password=' + $('input[name=password]').val() +
    $.ajax({
        type: "POST",
        url: "/ajax_login/",
        data: dataString,
        success: function(data) {
            alert(data);
        }   
     }); 
     return false;   
}

ここで、success メソッドはデータを受け取り、alertsそれをユーザーに返します。

アップデート

メソッドを定義したことajaxPwchange()はわかりますが、どこでも呼び出しているのを実際には見ていないので、ページがまだ更新されていると思います。ajaxPwchange()次のようにメソッドを送信ボタンのonclickイベントにバインドできます。

<input class="btn btn-primary" type="submit" value="submit" onclick="ajaxPwchange();" />

document.readyまたは、次のようにメソッドの下にバインドします。

$(document).ready(function(){
    $('input.btn-primary').click(function(){
        ajaxPwchange();
    });
});

更新2

次のコードでdivhtmljsonオブジェクトに直接変更しているため、div は消えます。

success: function(response) { // on success..
             $('#modalchangepw').html(response); // update the DIV
         }

むしろ次のようなことを試してください:

success: function(response) { // on success..
             var jsonData = $.parseJSON(response);
             $.each(response, function(){
                 $('#modalchangepw').append('<div class="message">' + $(this) + '</div>');
             });
         }
于 2012-12-31T09:16:23.507 に答える
10

非常に簡単な例を示します。これにより、概念を把握し、同じ概念を使用して、実行しようとしていることを実行できます。

で通常の​​ビューを作成することから始めますviews.py

def MyAjaxView(request):
    if request.is_ajax():
         if request.method == 'GET':
             # If it was a GET
             print request.GET
         elif request.method == 'POST':
             # Here we can access the POST data
             print request.POST
    else:
         doSomeOtherStuff()
    return render_to_response('mytemplate.html', some_context_maybe, context_instance=RequestContext(request))

すでに使用しているものまたは使用が許可されているものに応じて、javascriptまたはライブラリjQueryを使用してこれを呼び出します。

あなたがこのような形をしていると仮定します

<form id="myNameForm">
   {% csrf_token %}
   <input type="text" id="name" />
   <input type="submit" value="submit" id="submitButton" />
</form>

これで、JavaScriptを使用してこれをajax関数に接続できます。ここでは、jQueryをデモンストレーションとして使用し、jQueryメソッドajax()を使用して、概念を説明します。次に進むのpost()はそれほど難しいことではありません。

<script>
    $('#submitButton').click(function(event){
         event.preventDefault(); //so that we stop normal form submit.
         $.ajax(
             url: 'myViewUrl',
             type: 'post',
             dataType: 'json',
             data: $('form#myNameForm').serialize(),
             success: function(data) {
               doStuffWithDataHere(data);
             }
         );
    });
</script>

urls.py新しいビューへのURLマッピングがあることを確認する必要があります。CSRF保護を使用するには、CSRFプロセッサも使用する必要があります。ドキュメントについてはBurhanKhalidsのコメントを参照してください。

于 2012-12-31T08:43:45.580 に答える