Django - 根据第一个字段实时更新第二个list_filter字段?

Django - Update the second list_filter field in real time according to first field?

因此,我正在努力提高我的 django 知识,并且我正在从事这个个人项目,其中我有两个类别,一个是更通用的主要类别和一个子类别过滤器。

例如 main_category=智能手机,sub_category=samsung_phones。

我在 models.py 中的 class 将是:

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 将是:

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

现在我想做的是,在我的 /admin/ 页面中,我想根据我在 [=26= 中选择的内容实时更改 'sub_category' 过滤器的内容].这可能吗?因为现在它除了接受 space 之外什么都不做,所以 main_category 过滤器本身是没有用的。我认为这应该是一件容易的事,但我找不到任何关于它的文档。

Django 版本为 1.9.1

我会用 jQuery 注射:

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

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

如果你事先不知道数据或者它变化很大,因此无法构造一个jQuery/javascript函数来控制2个过滤元素,你需要重写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();
        }
    })
});