2

私は2つのモデルを持っています:

class TheMainThing(models.Model):
    ... some fields ...
    type = ManyToManyField('Type')

class Type(models.Model):
    ...more fields...

TheMainThings管理者で によるフィルタリングを有効にしたいと考えていTypesます。唯一の問題は、100k 以上のTypeオブジェクトがあるため、標準の組み込みフィルターを使用するのは現実的ではないということです。これは、すべてがTypes利用可能なオプションとしてブラウザに読み込まれるためです。(実際、Grappelli を使用していますが、標準の Django 管理者と同じだと思います)。

この問題に対する *don't_reinvent_the_wheel* アプローチはありますか?

raw_id フィールドの Grappelli のオートコンプリート ウィジェットが好きです。この問題には、そのようなものが理想的だと思います...

編集:
明確にするために-主な問題は、プレゼンテーションではなく、ブラウザでの読み込み時間とメモリ消費です。

4

1 に答える 1

0

管理者は、これらのフィルターを<ul>s 内のクエリ文字列を含むリンクとして出力します。代わりに、それらを選択用に変更できます。

そこで使用されるテンプレートはadmin/filter.html次のようになります。

{% load i18n %}
<h3>{% blocktrans with filter_title=title %} By {{ filter_title }} {% endblocktrans %}</h3>
<ul>
{% for choice in choices %}
    <li{% if choice.selected %} class="selected"{% endif %}>
    <a href="{{ choice.query_string|iriencode }}">{{ choice.display }}</a></li>
{% endfor %}
</ul>

同じ名前で独自のものを提供して、それらをオーバーライドすることができるので、次のようにやり直してください。

{% load i18n %}
<h3>{% blocktrans with filter_title=title %} By {{ filter_title }} {% endblocktrans %}</h3>
<select>
{% for choice in choices %}
    <option data-href="{{ choice.query_string|iriencode }}"
            {% if choice.selected %} selected="selected"{% endif %}>
    {{ choice.display }}
    </option>
{% endfor %}
</select>

次に、変更のフィルター リンクに従います。

$(function() {
    $('select', '#changelist-filter').on('change', function(e) {
        window.location = window.location.href + $(e.target).attr('data-href');
    });

});

さらに一歩進めると、後でSelect2のようなものでそれらを処理できます。

于 2012-10-23T04:40:04.313 に答える