2012-02-13 58 views
0

全部,將初始數據添加到使用JavaScript的Django ModelForm(JQuery)

我正在顯示模型表單集合。我正在使用JQuery動態表單集插件[http://code.google.com/p/django-dynamic-formset/]來處理在該表單集內添加/刪除單個表單。

當我添加一個新表單時,我想讓用戶選擇從數據庫中選擇一個模型來填充該表單。我使用AJAX調用Django視圖獲取可用模型。另一個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); 

你必須搞清楚你的​​領域被賦予什麼ID,因爲它很可能是某種形式的#field_id_[N]哪裏N是添加表單的迭代。只需像Firebug一樣反思文檔來源,看看生成的表單的HTML是什麼樣的。

一般注意事項

  1. 不要在視圖代碼中使用print。在開發中,print將輸出到控制檯,因爲Django開發服務器以交互方式運行,但在生產中最終會在某些日誌文件中或根本就沒有。如果事情不正確,並且希望收到通知或者故意將其與實際的Django日誌實用程序一起記錄,請始終引發異常。

  2. 沒有提供數據時引發Http404並不是真正處理這種情況的最佳方式,特別是在處理AJAX時。返回HttpResponseBadRequest()可能會更合適,保留Http404例外,因爲所提供的數據字面上不匹配數據庫中的任何內容。

  3. 如果您僅僅將它傳遞給查詢,則無需將id_to_get轉換爲int。它不會傷害任何東西,但它只是無關的代碼。

  4. 如果你正在處理這樣的通用內容類型,你應該使用contenttypes框架中的工具,而不是自己動手。

+0

感謝您的支持。我會試一試。我會在你的筆記1-3中做出你所建議的改變。我會研究注4。 – trubliphone 2012-02-13 21:07:01

+0

+1,所有優點(儘管在視圖中的打印語句對我來說是有罪的)。編號5:返回json數據而不是初始字典的字符串表示。這將使JavaScript更容易。 – Alasdair 2012-02-13 21:21:14

+0

@Alasdair:關於響應的一些事情擾亂了我,但我完全忽略了這個事實,即這應該是一個AJAX響應。哈哈,很好。 – 2012-02-13 21:24:49

相關問題