Каков эффективный способ создания сортируемого пользователем списка с помощью Django & Ajax? - PullRequest
0 голосов
/ 08 февраля 2011

Приложение, которое я создаю, показывает пользователям список элементов, которые являются экземплярами модели. Я хочу, чтобы они могли сортировать элементы так, как им хотелось бы, используя метод sortable () JQuery. Это реализовано и работает правильно, но мне нужен способ сохранить порядок, в котором они перечислены. Этот список обновляется довольно часто, элементы удаляются и добавляются новые.

Мой первоначальный подход состоял в том, чтобы дать модели столбец «позиция», и каждый раз, когда элемент списка перемещается в списке, меняйте значение позиции всех элементов в списке. Однако это потребовало бы от меня получения всех объектов модели при каждой сортировке 1 и применения изменений к каждому из них.

Единственный другой способ, которым я мог придумать, - дать каждому значение «вес» вместо их фактической позиции в списке. Оставьте достаточно места между каждым значением, чтобы заполнить пробелы. Например, веса равны 10, 20, 30 и 40. Если пользователь перемещает четвертый элемент во вторую позицию, посмотрите на первый и второй элементы и выберите 15 в качестве его веса. Это, конечно, будет работать так долго, пока все веса не будут пересчитаны для размещения предмета.

Я обдумываю это? Я не ожидаю большого использования от этого приложения, поэтому дополнительные вызовы модели с использованием столбца позиции не будут действительно проблемой - но если есть лучший, более эффективный способ сделать это, я все равно предпочитаю делать это так.

Спасибо: -)

Ответы [ 3 ]

1 голос
/ 08 февраля 2011

Если вам нужно сохранить его на более поздний срок, чем вы можете добавить вес или поле заказа в модель, а затем добавить логику для обработки изменяющихся весов в переопределенном методе сохранения. http://docs.djangoproject.com/en/dev/ref/models/instances/#saving-objects /811183/pereopredelenie-metoda-sohraneniya-v-django-modelform

Тогда вы можете использовать порядок в наборе запросов
http://docs.djangoproject.com/en/dev/ref/models/querysets/#order-by

1 голос
/ 08 февраля 2011

Теперь вы меня обдумываете!:)

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

Поэтому добавление новой записи означает стандартную вставку связанного списка:

  1. установить следующее поле новой записи
  2. установить поле prev для поля prev следующего поля новой записи
  3. установить следующее поле prev модели для новой модели.

Кроме того, вам нужно выбрать вес для вашего нового поля.Что-то вроде веса предыдущей записи с добавлением «.1», которое будет нормально сортироваться.

Удаление и переупорядочение аналогичны.

Затем вам понадобится задание cron, чтобы вымыть свои веса.время от времени.

Это приведет к тому, что вы сможете использовать только несколько моделей при вставке и переупорядочении ...

edit: На самом деле, вам, вероятно, даже не понадобитсяпредыстория и последующие области - лексикографический подход может работать просто отлично - но это не слишком продумано ... Я думаю, я уже слишком много думал об этом;)

0 голосов
/ 08 февраля 2011

Я бы отслеживал порядок сортировки в браузере и делал ajax-вызов на сервер каждый раз, когда таблица сортировалась, сохраняя порядок сортировки в переменной сеанса. (http://docs.djangoproject.com/en/dev/topics/http/sessions/)

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