【问题标题】:Django - Update the second list_filter field in real time according to first field?Django - 根据第一个字段实时更新第二个 list_filter 字段?
【发布时间】:2017-11-16 23:29:32
【问题描述】:

所以我正在努力提高我的 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

【问题讨论】:

    标签: django django-models django-admin django-admin-tools


    【解决方案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();
            }
        })
    });
    

    【讨论】:

    • 我确实预先知道数据,而且它们根本没有改变。所以我认为注入 jQuery 可能会起作用。但老实说,我对 JS 不太熟悉,你介意给我一个相关的链接/文档吗?
    • 直升机查看我的编辑。我没有对其进行测试,但应该为您指明正确的方向。干杯
    • 感谢丹的回答!我会调查一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    相关资源
    最近更新 更多