/documents/1/2009/edit/1120/
(см. в посте). Это post запрос на сохранение новых изменений. {
<Document: Title>: {},
<Document: Title>: {},
*** и так далее ***
}
class Document(models.Model):
parent = models.ForeignKey('self', related_name='children', blank=True, null=True)
position = models.PositiveIntegerField(blank=True, null=True)
<li class="dd-item infinite-item dd-collapsed" data-id="12005">
<!--Кнопки открытия/закрытия ветки-->
<i class="fa fa-minus-square" data-action="collapse" style="display: none;"></i>
<i class="fa fa-plus-square" data-action="expand" style=""></i>
<!--Область для перетаскивания-->
<div class="dd-handle"></div>
<div class="dd-content">
<span>
Название документа
</span>
</div>
<!--Эту область хочу подгружать по необходимости-->
<ol class="dd-list infinite-container" style="display: none;">
<!--Дальше рекурсия-->
</ol>
</li>
{% if node.get_children %}
.Document.objects.filter(id=data-id).get_descendants()
$("i[data-action='expand']").click(function(){
$.ajax({
url: "",
type: "post",
contentType: 'application/json; charset= utf-8',
dataType: 'json',
data: $(this).closest("dd-item").attr("data-id"), // Возвращает undefined
});
});
from django import template
register = template.Library()
@register.tag
def recursetree(parser, token):
bits = token.contents.split()
if len(bits) != 2:
raise template.TemplateSyntaxError(_('%s tag requires a queryset') % bits[0])
queryset_var = template.Variable(bits[1])
template_nodes = parser.parse(('endrecursetree',))
parser.delete_first_token()
return RecurseTreeNode(template_nodes, queryset_var)
class RecurseTreeNode(template.Node):
def __init__(self, template_nodes, queryset_var):
self.template_nodes = template_nodes
self.queryset_var = queryset_var
def _render_node(self, context, node):
bits = []
context.push()
for child in node.get_children():
bits.append(self._render_node(context, child))
context['node'] = node
context['children'] = mark_safe(''.join(bits))
rendered = self.template_nodes.render(context)
context.pop()
return rendered
def render(self, context):
queryset = self.queryset_var.resolve(context)
roots = queryset # Убрал cache_tree_children()
bits = [self._render_node(context, node) for node in roots]
return ''.join(bits)
from functools import wraps
def raise_if_unsaved(func):
@wraps(func)
def _fn(self, *args, **kwargs):
if not self.pk:
raise ValueError(
'Cannot call %(function)s on unsaved %(class)s instances'
% {'function': func.__name__, 'class': self.__class__.__name__}
)
return func(self, *args, **kwargs)
return _fn
class Document(models.Model):
***
@raise_if_unsaved
def get_children(self):
if hasattr(self, '_cached_children'):
qs = self._tree_manager.filter(pk__in=[n.pk for n in self._cached_children])
qs._result_cache = self._cached_children
return qs
Traceback (most recent call last):
File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/core/handlers/exception.py", line 41, in inner
response = get_response(request)
File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/core/handlers/base.py", line 217, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/core/handlers/base.py", line 215, in _get_response
response = response.render()
File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/response.py", line 107, in render
self.content = self.rendered_content
File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/response.py", line 84, in rendered_content
content = template.render(context, self._request)
File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/backends/django.py", line 66, in render
return self.template.render(context)
File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/base.py", line 207, in render
return self._render(context)
File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/base.py", line 199, in _render
return self.nodelist.render(context)
File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/base.py", line 990, in render
bit = node.render_annotated(context)
File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/base.py", line 957, in render_annotated
return self.render(context)
File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/loader_tags.py", line 177, in render
return compiled_parent._render(context)
File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/base.py", line 199, in _render
return self.nodelist.render(context)
File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/base.py", line 990, in render
bit = node.render_annotated(context)
File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/base.py", line 957, in render_annotated
return self.render(context)
File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/loader_tags.py", line 177, in render
return compiled_parent._render(context)
File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/base.py", line 199, in _render
return self.nodelist.render(context)
File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/base.py", line 990, in render
bit = node.render_annotated(context)
File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/base.py", line 957, in render_annotated
return self.render(context)
File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/loader_tags.py", line 72, in render
result = block.nodelist.render(context)
File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/base.py", line 990, in render
bit = node.render_annotated(context)
File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/base.py", line 957, in render_annotated
return self.render(context)
File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/loader_tags.py", line 72, in render
result = block.nodelist.render(context)
File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/base.py", line 990, in render
bit = node.render_annotated(context)
File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/base.py", line 957, in render_annotated
return self.render(context)
File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/loader_tags.py", line 216, in render
return template.render(context)
File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/base.py", line 209, in render
return self._render(context)
File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/base.py", line 199, in _render
return self.nodelist.render(context)
File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/base.py", line 990, in render
bit = node.render_annotated(context)
File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/base.py", line 957, in render_annotated
return self.render(context)
File "/Applications/Projects/web/dashboard.kase.kz/documents/templatetags/documents_tags.py", line 40, in render
bits = [self._render_node(context, node) for node in roots]
File "/Applications/Projects/web/dashboard.kase.kz/documents/templatetags/documents_tags.py", line 29, in _render_node
for child in node.get_children():
TypeError: 'NoneType' object is not iterable
author = models.ForeignKey(***)
, но в самой таблице нет внешнего ключа. Спасибо вам за разъяснения! manage.py migrate --fake [appname]
- прошла успешно.0001_initail.py
файл.author = models.ForeignKey(***)
, а в таблице нет внешнего ключа. Так как я уже упоманал стоит тип данных Number без ссылочной целостности. Я может чего-то не понимаю, возможно после команды migrate в идеале уже существующая таблица должна была поменяться? @register.tag
def recursetree(parser, token):
bits = token.contents.split()
if len(bits) != 2:
raise template.TemplateSyntaxError(_('%s tag requires a queryset') % bits[0])
queryset_var = template.Variable(bits[1])
template_nodes = parser.parse(('endrecursetree',))
parser.delete_first_token()
return RecurseTreeNode(template_nodes, queryset_var)
manage.py migrate --fake [appname]
.author = models.ForeignKey(***)
в своей модели данных, а в этой старой унаследованной таблице нету ссылочной целостности, то есть стоит просто тип данных Number, где хранится id пользователя, это вроде не хорошо так хранить. Из-за этого мне кажется не проходит миграция. Здесь либо нужно менять таблицу, либо модель данных. Что вы думаете по этому поводу?[{"id":1},{"id":2},{"id":3,"children":[{"id":4},{"id":5}]}]
A (tree_id=0, level=0)
B (tree_id=1, level=0)
--B1 (tree_id=2, level=1)
--B2 (tree_id=3, level=1)
C (tree_id=4, level=0)
--C1 (tree_id=5, level=1)
--C2 (tree_id=6, level=1)
----C21 (tree_id=7, level=2)
----C22 (tree_id=8, level=2)
position = 0
. Где лучше всего установить начально значение position?@classmethod
def tree_update(cls, parent_id, children, level=0):
position = 0
for child in children:
cls.objects.filter(pk=child['id']).update(parent_id=parent_id, level=level, tree_id=position)
position += 1
cls.tree_update(child['id'], child.get('children', []), level + 1)
@staticmethod
def tree_update(parent_id, children):
position = 0
for child in children:
Tree.objects.filter(pk=child['id']).update(parent_id=parent_id, tree_id=position, level=?)
position += 1
tree_update(child['id'], child.get('children', []))
A (level=0)
B (level=0)
B1 (level=1)
B2 (level=1)
C (level=0)
C1 (level=1)
C2 (level=1)
C21 (level=2)
C22 (level=2)
position += 1
в последней итерации. Второй вопрос еще актуален :) A
B
B1
B11
B2
Document.objects.filter(id=?).update(tree_id=?, level=?, parent_id=?)
К примеру url адреса я указываю следующим образом в форме редактирования:
urls.py:
В проблемный запрос (см. ниже), о котором я писал выше в посте формируется я так понимаю приложением django-el-pagination самостоятельно. Сам я на него повлиять не могу или я ошибаюсь?