2

我有两个模型:

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

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

我想TheMainThings在管理员中启用过滤Types。唯一的问题是有大约 100k 或更多的Type对象,因此使用标准的内置过滤器执行此操作是不切实际的。那是因为所有Types加载到浏览器中都是一个可用的选项。(实际上,我使用的是 Grappelli,但我相信它与标准 Django admin 相同)。

这个问题有*don't_reinvent_the_wheel* 方法吗?

我喜欢 Grappelli 在 raw_id 字段上的自动完成小部件,我想这样的东西对这个问题来说是理想的……它有这样的东西吗?

编辑:
澄清 - 主要问题是浏览器中的加载时间和内存消耗,而不是演示文稿。

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 回答