0

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

例如 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']
    ...

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

Django 版本是 1.9.1

4

1 回答 1

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();
        }
    })
});
于 2017-06-15T09:32:09.310 回答