2017-06-14 107 views
0

所以我想改善我的django知識,我正在研究這個個人項目,其中我有兩個類別,主要是更一般的和一個子類別過濾器。Django - 根據第一個字段實時更新第二個list_filter字段?

一個例子是main_category = smartphone,sub_category = samsung_phones。

我在models.py類將是:

class Products(models.Model): 

    product_name = models.CharField(max_length=20) 
    main_category = models.CharField(max_length=50) 
    sub_category = models.CharField(max_length=50) 

和我的admin.py類將是:

class ProductsAdmin(ImportExportModelAdmin): 
    ... 
    list_filter = ['main_category', 'sub_category'] 
    ... 

現在我要做的是,在我的/管理/頁面,我想要改變'sub_category'過濾器的內容 - 實時 - 並根據我在'main_category'中選擇的內容。這可能嗎?因爲現在它除了佔用空間之外沒有任何其他的工作,所以main_category過濾器本身沒有用處。我認爲這應該是一件容易的事情,但我找不到任何有關它的文檔。

Django的版本是1.9.1

回答

1

我會用一個jQuery注入做到這一點:

class ProductsAdmin(ImportExportModelAdmin): 
    ... 
    list_filter = ['main_category', 'sub_category'] 
    ... 

    class Media(object): 
     js = (
      'app/js/myscript.js', # app static folder 
     ) 

如果你不知道數據的前期或者它改變了很多,因此無法構建一個用於控制2個過濾器元素的jQuery/javascript函數,您需要重寫change_list函數和模板來注入動態js/jQuery。

或者,因爲我太懶惰了,沒有別的事情,我只會創建一個js文件,每次訪問管理頁面時我都會用動態js覆蓋。

編輯1: js文件可能是這樣的(關當然,這可以大大提高,但它是由你):

// save here your array with data 
my_main_category = { 
    "": ['Samsung', 'Nokia', 'Dacia', 'Alfa Romeo', 'Volga'], // add them all 
    "Smartphones": ['Samsung', 'Nokia'], 
    "Cars": ['Dacia', 'Alfa Romeo', 'Volga'] 
}; 

// copy options to repopulate sub category select 
var $sub_category_options = $('select[data-name="sub_category"] > option').clone(); 

$('select[data-name="main_category"]').on('change', function() { 
    $('select[data-name="sub_category"]').empty().append($sub_category_options); 
    $('select[data-name="sub_category"] option').each(function() { 
     if ($.inArray($(this).val(), my_main_category[$('select[data-name="main_category"]').val()])) { 
      $(this).remove(); 
     } 
    }) 
}); 
+0

我不知道數據的前期,和他們不」根本不會改變。所以我認爲注入jQuery可能工作。但我並不熟悉JS,說實話,你介意給我一個相關的鏈接/文檔,我可以看到我可以怎麼做? – Helicopter

+1

直升機看到我的編輯。我沒有測試它,但應該指出你在正確的方向。乾杯 –

+0

謝謝你的答案丹!我會研究這個。 – Helicopter

相關問題