@nurzhannogerbek

Как сохранить новую структуру дерева в БД после изменения структуры дерева?

Здравствуйте! Подскажите пожалуйста как правильно реализовать следующую задачу.

Использую приложение django-mptt и плагин jsTree для построение деревовидной структуры документов.

jsTree дает возможность перемещать элементы внутри дерева. Чтобы структура дерева не потерялась после обновления страницы, нужно зафиксировать эти изменения в базе данных. Хочу после нажатия кнопки с определенным селектором сохранять новую структуру дерево и обновить блок где находится дерево.

В данный момент я построил следующий порядок действий (поправьте, если рассуждения не верны):

1) При нажатию кнопки нужно будет пройтись по дереву в JS и взять по каждому элементу дерева 5 параметров:
id - id документа;
old_parent и new_parent - id родительских документов (из какой перемещаем и в какую)
old_position и new_position - порядковые номера категории в старом и новом месте.

В итоге получить некий массив данных подобного формата:
[
   {'id': 35, 'old_parent': 30, 'new_parent': 31, '': 9, "old_position": 2, "new_position": 5},
   {...},
   {...}
]


2) Затем через ajax запрос передать во views данные массива в JSON формате. Используя данные из массива обновить документы во views.

3) По умолчанию приложение django-mptt в БД для таблицы создает такие поля:
tree_id - как я понял по этому полю происходит сортировка.
parent_id - в этом поле хранятся данные о предке скажем так
level - уровень сложенности
lft и rght - не понял зачем нужны эти поля. Поэкспериментировал с данными для этих полей и они никак не влияют на отображение дерева.

На основе данных рассуждений начал писать следующий код, но он ничего не происходит при д. В чем ошибка и правильны ли вообще мои рассуждения?

templates:
{% load mptt_tags %}

<ul>
    {% recursetree documents %}
        <li>
            {{ node.title }}
            <ul class="children">
                {{ children }}
           	</ul>
        </li>
    {% endrecursetree %}
</ul>


JS:
$("#document-order-btn").click(function(){
				$('#documents').jstree().bind('ready.jstree', function(event, data) {
					var listParameters = [];
					var parameters = {};
					var $tree = $(this);
					$($tree.jstree().get_json($tree, {flat: true})).each(function(index, value) {
						var node = $("#documents").jstree().get_node(this.id);
						parameters = {
							"id": node.id,
							"old_parent": node.old_parent,
							"new_parent": node.parent,
							"old_position": node.old_position,
							"new_position": node.position
						};
						listParameters.push(parameters);
					});
					$.ajax({
						url: "documents_order/",  // По данному адресу запускается вьюха DocumentOrderView 
						type: "post",
						contentType: 'application/json; charset= utf-8',
						dataType: 'json',
						data: JSON.stringify(listParameters)
					});
				});
			});


Во первых при нажатии кнопки в JS не могу получить данные. Почему-то данная строка в JS не работает:
$('#documents').jstree().bind('ready.jstree', function(event, data) {


Также я поэкспериментировал и заметил что node.id будет возвращать не id документа, а то задал jsTree при рендовинге. Например: js1_2. В кухню jsTree плагина не заглядывал, поэтому не знаю как поменять данную вещь.

Вторая проблема как правильно отпарсить данные во view? Я думаю должно быть что-то на подобии во вью. Хотя не уверен достаточно ли будет 5 параметров для целостности данных. Как видите вопросов много и не получается все уложить в голове.

views.py:
from braces.views import CsrfExemptMixin, JsonRequestResponseMixin

class DocumentOrderView(CsrfExemptMixin, JsonRequestResponseMixin, View):
    def post(self, request, *args, **kwargs):
        for id, ???, new_parent  in self.request_json.items():
            Document.objects.filter(id=id).update(parent_id=new_parent, ???)
        return self.render_json_response({'saved': 'OK'})
  • Вопрос задан
  • 377 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы