Альтернативная форма для Django `ChoiceField`, которая может обрабатывать тысячи записей - PullRequest
1 голос
/ 13 марта 2012

У меня есть форма с ChoiceField в нем.Он отображается для пользователя в виде выпадающего списка.

Проблема в том, что у меня есть тысячи записей в этом поле, из-за чего страница (а) загружается очень медленно и (б) медленно.

Мне нужен альтернативный виджет вместо Select, который мог бы обрабатывать более 10000 вариантов выбора.

Было бы неплохо что-то вроде raw_id_fields для администратора (если бы его можно было использовать в общих формах...) но я открыт для идей.

Ответы [ 3 ]

1 голос
/ 13 марта 2012

Если автозаполнение является опцией для вашего пользовательского интерфейса, вы можете посмотреть django-simple-autocomplete :

Приложение, позволяющее использовать виджет автозаполнения jQuery UI для ModelChoiceFields стребуется минимальная конфигурация.

EDITED (ответ на комментарий OP)

Я не тестировал это решение, но при копании документации и источника кажется, что не все данныезагружается за один раз:

Возможность указать URL-адрес для виджета позволяет при необходимости подключаться к другим более продвинутым обработчикам запросов автозаполнения.

Исходный код :

def get_json(request, token):
    """Return matching results as JSON"""
            ...
            di = {'%s__istartswith' % fieldname: searchtext}     # <- look here!
            items = queryset.filter(**di).order_by(fieldname)[:10]

Исходный код виджета

$("#id_%(name)s_helper").autocomplete({
    source: function(request, response){
        $.ajax({                                  # <-- look here
            url: "%(url)s",
            data: {q: request.term},
            success: function(data) {
0 голосов
/ 13 марта 2012

Исходя из этого комментария (который на самом деле вы должны были включить в свой вопрос):

Позвольте мне уточнить мою задачу: у меня 10 000 пользователей.У меня есть форма, в которой вы выбираете пользователя.Вы должны быть в состоянии выбрать любого пользователя, которого вы хотите.Вы не можете просто загрузить 20, потому что тогда вы не сможете выбрать других 9 980 пользователей.

Если вы хотите что-то встроенное, вы можете использовать FilteredSelectMultiple виджет из django.contrib.admin.widgets, который устанавливает фильтр на ваш выбор.

Вы также должны кешировать результаты 10000 пользователей, чтобы вы не ударяли по БД каждый раз.Это именно то, что вызывает вашу задержку, а не количество пользователей (что незначительно из-за практических проблем с производительностью).

0 голосов
/ 13 марта 2012

Я не знаю, что такое raw_id_fields, но почему бы не использовать модель для хранения всех ваших выборов?

class Choice(models.Model):
    value = models.CharField()

class MyModel(models.Model):
    choice = models.ForeignKey(Choice)

Тогда было бы легко выбрать его, если вы хотите, например, отображать только 20.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...