2013-08-23 2 views
0

На моем взгляде, я создаю следующий словарь списков из QuerySetДжанго петля шаблона collections.defaultdict (лямбда: collections.defaultdict (список))

#view.py 
queryset = MyModel.objects.filter(owner=user, dashboard=tab).order_by('position') 
my_dict = collections.defaultdict(lambda: collections.defaultdict(list))  
for obj in queryset: 
    my_dict[int(obj.position.split('-')[0])][int(obj.position.split('-')[2])].append(obj) 
return Response({'queryset': dict(my_dict)}, template_name='dashboard/_maps_tab.html') 

поля Положения является charFiled следующим формата: XXXX используется создать my_dict

my_dict является

--[1] #group 
----[1] #col 1 
------ object1.1.1 #group.col.pk 
------ object1.1.2 
------ object1.1.3 
----[2] #col 2 
------ object1.2.4 
----[3] #col3 
------ object1.3.5 
------ object1.3.6 

--[2] #group 
----[1] #col 1 
------object2.1.7 #group.col.pk 

--[3] #group 
----[1] #col1 
------ object3.1.8 #group.col.pk 
----[2] #col2 
------object3.2.9 
------object3.2.10 

в моем шаблоне я хотел бы сделать

{% for groups in queryset.iteritems %} 

    groups = {{ groups }} <br> 

    {% for cols in groups %} 

     cols = {{ cols }} <br> 

     {% for objs in cols %} 

     {{ objs }} in <br><br> 

     {% for obj in objs %}   
      {{ obj.title }}, 
      {{ obj.desc}}, 
      {{ obj.fieldN }},   

     {% endfor %} 

     {% endfor %} 


    {% endfor %} 

{% endfor %} 

В результате

groups = (1, defaultdict(<type 'list'>, {1: [<Obj: Obj 1 by daviddd>, <Obj: Obj 2 by daviddd>, <Obj: Obj3 by daviddd>], 2: [<Obj: Obj 4 by daviddd>], 3: [<Obj: Obj 5 by daviddd>, <Obj: Obj 6 by daviddd>, <Obj: Obj 7 by daviddd>]})) 
cols = 1 
cols = defaultdict(<type 'list'>, {1: [<Obj: Obj 1 by daviddd>, <Obj: Obj 2 by daviddd>, <Obj: Obj3 by daviddd>], 2: [<Obj: Obj 4 by daviddd>], 3: [<Obj: Obj 5 by daviddd>, <Obj: Obj 6 by daviddd>, <Obj: Obj 7 by daviddd>]}) 

groups = (2, defaultdict(<type 'list'>, {1: [<Obj: Obj 7.7 by daviddd>]})) 
cols = 2 
cols = defaultdict(<type 'list'>, {1: [<Obj: Obj 7.7 by daviddd>]}) 

groups = (3, defaultdict(<type 'list'>, {1: [<Obj: Obj 7.8 by daviddd>]})) 
cols = 3 
cols = defaultdict(<type 'list'>, {1: [<Obj: Obj 7.8 by daviddd>]}) 

Я пытался сделать {% for cols in groups.1 %}, но это не работает (пусто). Если я делаю {% для cols в groups.iteritems%}, у меня есть: «Int is iterable».

Глядя на https://code.djangoproject.com/ticket/16335 моем случае

my_dict = collections.defaultdict(lambda: collections.defaultdict(list))  
dictionary['foo']['foo1'].append('bar') 

Как я могу решить?

Заранее благодарен!

D

+0

Используйте [Джанго-mptt] (HTTPS: //github.com/django-mptt/django-mptt/) –

+0

Я никогда не использовал django-mptt для этой цели, хорошо знать. Я должен сохранить структуру dict, потому что он загрузит сложную страницу HTML/jQuery – Daviddd

ответ

0

Мой view.py раствор:

my_dict = collections.defaultdict(lambda: collections.defaultdict(list)) 

    for obj in queryset: 
     my_dict[int(obj.position.split('-')[0])][int(obj.position.split('-')[2])].append(obj) 

    for obj in my_dict:    
     my_dict[obj].default_factory = None 

    return Response({'queryset': dict(my_dict)}, template_name='_internal_template.html') 

Связанное https://code.djangoproject.com/ticket/16335 и Django template can't loop defaultdict

Мой шаблон

{% for groups in queryset.itervalues %} 

    groups = {{ groups }}  
    <br><br> 

    {% for cols in groups.itervalues %} 

     cols = {{ cols }}  
     <br><br> 

     {% for obj in cols %} 

     obj = {{ obj}} in <br><br> 
     obj info = {{ obj.title }}, {{ obj.abstract }}<br> 

     {% endfor %}  

    {% endfor %} 

{% endfor %} 
Смежные вопросы