2012-02-13 8 views
0

すべて、JavaScript(JQuery)を使用してDjango ModelFormに初期データを追加する

私は私のビューにモデルフォームセットを表示しています。私は、フォームセット内の個々のフォームの追加/削除を処理するために、JQueryダイナミックフォームセットプラグイン[http://code.google.com/p/django-dynamic-formset/]を使用しています。

私は新しいフォームを追加するときに、データベースからモデルを選択してそのフォームに入力するオプションをユーザーに与えたいと考えています。私はDjangoビューへのAJAX呼び出しを使用して、使用可能なモデルを取得します。別のAJAX呼び出しは、選択されたモデルに対応するフォームのform.initialデータを取得します。私の質問は、最初のデータを取り込んでテンプレートに新しく追加されたフォームを挿入する方法です(クライアントではJavaScriptで)。

def get_content(request): 
    app_to_get = request.GET.get('a', None) 
    model_to_get = request.GET.get('m', None) 
    id_to_get = request.GET.get('i',"") 
    if not app_to_get and not model_to_get and not id_to_get: 
     print "invalid or incomplete app/model/id combination" 
     raise Http404() 

    id_to_get = int(id_to_get)  

    # these two fns get me the appropriate classes for the model_to_get 
    # they work and are irrelevant for my current question  
    model_class = get_model_from_name(model_to_get,app_to_get) 
    form_class = get_form_from_model(model_class) 

    model = model_class.objects.get(pk=id_to_get) 
    form = form_class(instance=model)  

    formTemplate = Template("{{ form.initial }}") 
    formContext = Context({"form" : form}) 

    return HttpResponse(formTemplate.render(formContext)); 

そしてここではいくつかのJavaScriptです:初期データを取得するための

ビュー:

function add_model() { 
     var url = window.document.location.protocol + "//" + window.document.location.host + "/get_content/"; 
     url += "?a=" + app_to_add_to + "&m=" + model_to_add + "&i=" + id_to_add; 

     $.ajax({ 
      url : url, 
      type : 'get', 
      success : function(data) { 
       alert(data); 
       /* I AM HERE I AM HERE I AM HERE */ 
      } 
     }); 
     return true; 
    }; 

この時点で、dataは次のようになります。

{'url': u'http://www.foo.com/', 'id': 2, 'title': u'foo'} 
ここではいくつかの関連するコードです

しかし、そのデータを新しく追加したフォームにマップする方法はわかりません。

答えて

2

あなただけ関連したデータと関連するフィールドの値を設定します。

$('#some_field').val(data.some_value); 

それが最も可能性の高い#field_id_[N]場所のいくつかのフォームになりますので、あなたは、あなたのフィールドが与えられているかのIDを把握する必要がありますNは追加された形の反復です。 Firebugのようなものでドキュメントソースを調べて、生成されたフォームのHTMLがどのように見えるかを確認してください。

一般的な注意事項

  1. ビューコードでprintを使用しないでください。開発中のprintは、Django開発サーバーが対話的に実行されるため、コンソールに出力されますが、一部のログファイルには生成されません。何かが正しくなく、実際のDjangoロギングユーティリティで意図的にログに記録したい場合は、例外を発生させてください。

  2. データが提供されていないときにHttp404を発生させることは、特にAJAXを扱うときに、状況を処理するための最良の方法ではありません。返されるHttpResponseBadRequest()は、提供されたデータが文字通りデータベース内のものと一致しない場合には、Http404例外を予約する方が適切でしょう。

  3. id_to_getintに変換する必要はありません。クエリに渡すだけの場合は、それは何も傷つけることはありませんが、それはちょうど外的なコードです。

  4. このような一般的なコンテンツタイプを扱う場合は、独自のロールアップではなく、contenttypesフレームワークにある機能を使用する必要があります。

+0

ありがとうございます。私はそれを試してみましょう。あなたのノート1-3に示唆した変更を行います。注4を調べます。 – trubliphone

+0

+1、すべての良い点(ビューの印刷文は私には罪深い喜びですが)。番号5:初期辞書の文字列表現の代わりにjsonデータを返します。それはjavascriptをはるかに簡単にします。 – Alasdair

+0

@Alasdair:レスポンスの何かが私に迷惑をかけましたが、AJAXレスポンスであると考えられています。ハハ、いいキャッチ。 –

関連する問題