2011-03-18 60 views
3

我正在用3個類製作一個應用程序:employeee,company和department。具有即時過濾選項的Django ModelChoiceField

當我編輯僱員時,我需要了解他的公司,以及與選定公司的所有部門有一個領域。但是當我使用ModelChoiceField時,我會看到所有公司的所有部門。

這不是特權問題。對於部門領域的驗證,它需要成爲所選公司的一個部門。但是,我不想對此進行驗證,我只需要顯示上面字段中選擇的特定公司的部門。

因爲這是一個客戶端操作,我認爲JavaScript將是必要的,所以我想知道它是否在django中以某種方式自動執行,或者我需要爲此目的下載一個django插件或jquery插件。

我感謝任何幫助,謝謝!

+1

我會定義視圖的過濾器選擇公司的部門。 然後使用jQuery在公司更改時加載部門的組合。 – JMira 2011-03-18 14:29:09

回答

4

它不是一個內置的Django的東西,並需要一點點的黑客攻擊,但我以前做過這種事情。

您將需要將jQuery AJAX請求附加到公司選擇字段的onChange事件。當某人選擇一家公司時,您會查詢數據庫,並要求提供特定於該公司的部門清單。

編輯:

類似下面的JavaScript和Django會工作:

$('#id_company').change(function(){ 
    $.POST('{% url some_url_name %}', 
    { 
     'company_id': $('#id_company').val() 
    }, 
    function(data){ 
     if(data.valid){ 
     var d = '<select id="id_department" name="department">'; 
     $.each(data.records, function(k,v){ 
      d += '<option value="' + v.id + '">' + v.name +'</option>'; 
     }); 
     d += '</select>'; 
     $('#id_department').html(d); 
     } 
    }, 'json' 
); 
}); 


def ajax_request(request, company_id): 
    if request.is_ajax() and request.method == 'POST': 
    data = simplejson.dumps(Department.objects.filter(company__id=company_id) 
    return HttpResponse(data, mimetype='application/javascript') 
+0

正如你之前做過的那樣,你有代碼示例嗎? – StaticX 2011-03-18 14:36:07

+0

我已將def ajax_request放在應用程序的view.py中。和.js文件中的js。我在哪裏可以調用ajax_request方法? – StaticX 2011-03-18 17:01:34

+0

這不是一種方法,你只需將它添加到你的urls.py(並且重要的給它一個名字,這樣你就可以通過它的名字訪問url),然後在js中,如上所示,使用{%url name_of_ajax_request_url%}輸出ajax_request url的地址。 – 2011-03-21 14:16:03