0

私は過去数日間、いくつかの「Django / AJAXチュートリアル」を読みましたが、私はAJAXまたはJQuery(AJAX実装で使用することに決めたライブラリです。それが理にかなっている場合は、他のものを使用します)。

データベースの更新の一部を非同期で実行したいので、毎回ページ全体をリロードする必要はありませんが、ほとんどのフォームは動的であるため、「簡単な」方法は見当たりません。かなりの量の新しいコードを書かずにこれを行います。それほど多くの新しいコードを書かなくても、私が達成しようとしていることをより簡単に実行できる方法があるかどうか知りたいです。

私の元のアプリは完全に静的です。つまり、データを投稿するたびに、ビュー全体をリロードする必要があります。プラス面としては、基本的にすべてをポストで再構築しているので、フォームの特定の要素を表示/非表示にするかどうかを簡単に判断できます。私のアプリの典型的な例:ユーザーがドロップダウンリストの値を変更すると、フォームが再読み込みされ、選択した値に基づいて新しいフィールドが表示または非表示になります。

def example_view(request):
    if "dropdown_selection" in request.GET:
        dropdown_value = request.GET['dropdown_selection'])
        # more code to save dropdown_value to my database

    .....
    # way later on in the same view
    if dropdown_value == SHOW_EXTRA_STUFF:
        # code to add a bunch of extra elements to a form

良くも悪くも、私はこのようなビューにたくさんのロジックを持っており、データベースに保存されている値に基づいて表示/非表示にする要素を決定します(通常、受信した投稿データを事前に読み取り、それを最初にデータベース)。だから今、私はもう少し非同期的に物事を始めたいと思います:-)

テンプレートにいくつかの簡単なコードを入れて、AJAXを介してデータベースを更新するための簡単なドロップダウンボックスを接続することができました。

$(document).ready(function() { 
    $('#{{dropdown_id}}').change(function() {
        var dropdown_data = $('#{{dropdown_id}}');
        var data = {}
        data["{{dropdown_id}}"] = dropdown_data.val();
        var args = { type:"GET",
            url:"submit/", data:data };
        $.ajax(args);
    })
});

また、urls.pyを更新して、その特定のURLを別のビューにリダイレクトします。これにより、新しいドロップボックスの値がデータベースに保存されます。その部分はうまく機能しますが、もちろん、元のビューにはこのロジックがすべて含まれていますが、ドロップダウン値が舞台裏で変更されたため、これは無効になっています。ページの更新を強制すると、すべてが正しく更新され、新しい値が反映されます。テンプレートに大量のJqueryコードを記述せずに、既存のロジックを引き続き使用できる(つまり、このフォームを表示または非表示にする)簡単な方法があるかどうか疑問に思っています。これらすべてにアクセスする必要があると思います。要素を直接、新しいロジックの束を必要とします。データベース値を更新し、すべてのhtmlコードを再構築するロジックを除いて、元のビューにあったものを正確にやり直したいようなものです。ただし、実際にはページ全体を更新する必要はありません。多分それはただ希望的な考えです:-/

更新-私の解決策

フォローアップとして、Ignacioの提案に従って、これを機能させました。既存のビュー/ロジックを使用し、最小限のコードを追加して、完全なAJAX更新を取得できます。静的ページを動的ページに変換するために行うプロセスは次のとおりです。

  1. 次のような新しい「ベース」ページを作成します。

    {% block content %}
        <div id="dynamic_data">
        </div>
    
    <script>
    $(document).ready(function() { 
        $('#dynamic_data').load('submit/');
        $('#dynamic_data').change(function() {
            $('#criteria_table').load('submit/');
        });
    });
    </script>
    
    {% endblock content %}
    
  2. 新しいビューを作成します。これは、URLに「送信」があることに基づいて、呼び出すurls.pyを更新する必要があります。このビューは、追加のパラメーターを使用して、元のビューを呼び出すだけです。

    def new_view(request):
        return original_view(request, repost=True)
    
  3. 元のビューを更新して、「repost」パラメーターを設定します。最後に、返されるテンプレートを変更することを除いて、他のすべては同じままです。

    def original_view(request, repost=False):
        # all my database updates, dynamic form generation, etc
        # everything stays the same
        ...
        if repost == True:
            return render_to_response("myapp/new_table.html",
                    context,
                    context_instance=RequestContext(request))
        else:
            return render_to_response("myapp/base.html",
                    context,
                    context_instance=RequestContext(request))
    
  4. さかのぼると、私の「base.html」は上記で投稿した単純なテンプレートです。私の「new_table」テンプレートは、すべての動的データを生成した元のテンプレートです。つまり、元のテンプレートを別の場所に移動し、そのテンプレートを実行する新しいビューを作成し、その結果を使用してデータをdivに再投稿するだけです。

もう一度ありがとうIgnacio

4

1 に答える 1

1

テンプレートを論理的な部分に分割し、テンプレートタグを介して実装できるようにします。次に、テンプレートタグが委任する関数をビュー関数でラップし、AJAXを介してそれらを呼び出し<div>、ページ内の適切なに置き換えます。

于 2012-04-18T03:31:18.287 に答える