Транспонировать таблицу Django в django_tables2
Я пытаюсь сделать вид, который по существу показывает информацию о записи, как это
|Description| blahblahblah
|Name | blah blah blahs
|Last Edited| someDate
|Owned by | Blah blah blah info
который транспонирован из способа, которым django_tables2 отображает таблицы по умолчанию. Есть ли простой способ сделать это или мне придется кодировать свой собственный шаблон? Я считаю, что делаю это (теоретически), так как есть хороший пример пользовательского шаблона, который говорит, что я должен "передать экземпляр вашего подкласса Table в ваш собственный шаблон и визуализировать его самостоятельно". Я не знаю, что на самом деле означает это:(
3 ответа
Вам нужно будет написать свой собственный шаблон, который создает желаемый HTML, перебирая атрибуты таблицы и записывая правильные теги. Хорошим примером того, как вы можете это сделать, является шаблон, используемый для as_html()
функция: https://github.com/bradleyayers/django-tables2/blob/master/django_tables2/templates/django_tables2/table.html
Я решил это для проекта сегодня, на самом деле это было довольно просто.
Определить новую таблицу
В tables.py
определить таблицу из двух столбцов. Давайте назовем первый столбец name
и второй столбец value
:
class RowTable(tables.Table):
name = tables.Column()
value = tables.Column()
class Meta:
template = 'django_tables2/bootstrap.html'
attrs = {'class': 'table table-striped table-responsive'}
По вашему мнению, привязать данные к таблице
Затем, по вашему мнению, вам нужно извлечь экземпляр (строку) из вашей базы данных и заполнить таблицу с помощью словаря:
row_instance = Model.objects.get(foo=foo.id)
#Extract column data from instance be sure it is string!
height = str(row_instance.height)
weight = str(row_instance.weight)
nationality = row_instance.nationality
#Create dictionary of data in form table will recognize
row_data =[ {'name': 'height', 'value': height},
{'name': 'weight', 'value': weight},
{'name': 'nationality', 'value': nationality} ]
#Bind to table and configure
table = RowTable(row_data)
Затем настройте таблицу, поместите в контекст и отправьте в шаблон как обычно. У вас будет таблица с двумя столбцами, показывающая все данные из строки вашей базы данных.
Измените функцию result_list(cl) в /lib/python2.7/site-packages/django/contrib/admin/templatetags/admin_list.py следующим образом:
def result_list(cl):
"""
Displays the headers and data list together
"""
headers = list(result_headers(cl))
num_sorted_fields = 0
for h in headers:
if h['sortable'] and h['sorted']:
num_sorted_fields += 1
result1 = list(results(cl))
result2 = map(list, zip(*result1))
return {'cl': cl,
'result_hidden_fields': list(result_hidden_fields(cl)),
'result_headers': headers,
'num_sorted_fields': num_sorted_fields,
'results': result2}