2017-06-14 85 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

相关问题