Как лучше вывести лист в таблицу: N ячеек в строке

3 views
Skip to first unread message

Wadim

unread,
Jul 28, 2010, 5:57:54 AM7/28/10
to Django russian
Добрый день
У меня есть лист который я хочу вывести в таблице на странице.
нужно сгрупировать этот лист по строчкам.
N ячеек в каждой строке.
Пока я сделал функцию которая делает эту групировку:
def groupListByRow(list):
cnt=0
rows=[]
while cnt<len(list):
row=[]
for x in range(5):
if cnt<len(list):
row.append(list[cnt])
else:
row.append(None)
cnt+=1
rows.append(row)
return rows;

Может возможно сделать такую же групировку в темплейтах?
Вадим

bur...@gmail.com

unread,
Jul 28, 2010, 1:04:21 PM7/28/10
to django-...@googlegroups.com
Привет,

если не расширять шаблоны и не извращаться, то такую группировку на
шаблонах сделать нельзя (хм, считая, что нужно выводить по 5
элементов, если использовать '|slice:"{{x}}:{{y}}"', плюс add в
шаблонах для инкремента на 5, то я, наверное, смог бы так извратиться
;) ).
Тем не менее, на djangosnippets штук пять таких "группировщиков" (все
чуть-чуть разные), или ещё можно сделать подобную штуку через css и
<li> -- получишь резиновость, которой у тебя не будет с
группировщиком. К недостаткам CSS+LI относится трудность настройки.

Но мой совет -- оставь всё как есть. Ведь тебе скорее всего нужно
делать это один раз (или два).
У тебя даже нет нужды писать html во вьюхе, ты просто делаешь из
одномерного массива двухмерный и его потом будешь рендерить.

2010/7/28 Wadim <wadim.ov...@gmail.com>:

--
Best regards, Yuri V. Baburov, ICQ# 99934676, Skype: yuri.baburov,
MSN: bu...@live.com

kmike

unread,
Jul 28, 2010, 1:10:02 PM7/28/10
to Django russian
from django.template import Library, Node, TemplateSyntaxError

register = Library()

class SplitListNode(Node):
def __init__(self, list_string, chunk_size, new_list_name):
self.list = list_string
self.chunk_size = chunk_size
self.new_list_name = new_list_name

def split_seq(self, seq, size):
""" Split up seq in pieces of size, from
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/425044"""
return [seq[i:i+size] for i in range(0, len(seq), size)]

def render(self, context):
context[self.new_list_name] =
self.split_seq(context[self.list], int(self.chunk_size))
return ''

def split_list(parser, token):
"""<% split_list list as new_list 5 %>"""
bits = token.contents.split()
if len(bits) != 5:
raise TemplateSyntaxError, "split_list list as new_list 5"
return SplitListNode(bits[1], bits[4], bits[3])

split_list = register.tag(split_list)

kmike

unread,
Jul 28, 2010, 1:18:20 PM7/28/10
to Django russian
ага, это один из сниппетов

Wadim

unread,
Jul 30, 2010, 8:28:35 AM7/30/10
to Django russian

> Но мой совет -- оставь всё как есть. Ведь тебе скорее всего нужно
> делать это один раз (или два).
> У тебя даже нет нужды писать html во вьюхе, ты просто делаешь из
> одномерного массива двухмерный и его потом будешь рендерить.

Спасибо. так с сделаю. нашел пару пример как это делать в темплейте.
но код получается еще запутанней.

Serge Matveenko

unread,
Jul 30, 2010, 12:35:37 PM7/30/10
to django-...@googlegroups.com
2010/7/30 Wadim <wadim.ov...@gmail.com>:

думаю, что на мысли может навести вот такая конструкция:

zip(*((i for i in lst),)*N)

где lst - ваш список, а N - количество колонок

P.S.: последняя, не полная строка не отображается


--
Serge Matveenko
jabber:se...@matveenko.ru
microblog:http://identi.ca/lig
profile:http://ru.linkedin.com/in/sergematveenko

Reply all
Reply to author
Forward
0 new messages