0

だから私はジャンゴの知識を向上させようとしており、この個人的なプロジェクトに取り組んでいます。このプロジェクトでは、より一般的なメインのカテゴリとサブカテゴリ フィルターの 2 つのカテゴリがあります。

例は、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
        )

データが事前にわからない場合、またはデータが頻繁に変更されるため、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();
        }
    })
});
于 2017-06-15T09:32:09.310 に答える