форматирование содержимого ячейки таблицы в django-tables2

Люблю django-таблицы... но то, что, я уверен, несложно решить, меня раздражает. Когда значение, которое я передаю для данной строки/столбца, похоже на:

some<br/>random<br/>words<br/>returned

Я хочу, чтобы браузер анализировал и отображал содержимое этой ячейки... чтобы оно выглядело так:

возвращено несколько
случайных
слов

не экранировать содержимое, которое я передаю, и отображать его следующим образом:

some<br/>random<br/>words<br/>returned

Наверняка есть какой-то флаг или опция, которую я пропустил?


person codemonkey    schedule 11.09.2012    source источник
comment
Можете ли вы показать мне свой код Table и как вы вводите значение HTML в таблицу?   -  person bradley.ayers    schedule 13.09.2012
comment
Для ясности предположим, что все столбцы таблицы имеют вид column_name = table.Column(), и что я достаточно запутан, чтобы иметь вывод хранимой процедуры, связанный с таблицей, предоставляющей строковые значения, включающие разметку. На самом деле я делал это немного по-другому, но я не уверен, что это имеет значение в контексте этого разговора.   -  person codemonkey    schedule 14.09.2012


Ответы (3)


Используйте mark_safe следующим образом:

import django_tables2 as tables
from django.utils.safestring import mark_safe

class testTable(tables.Tables):
    id = tables.Column()
    html = tables.Column()

    def render_html(self):
        return mark_safe('some<br/>random<br/>words<br/>returned')

Тот же вопрос был задан в этой теме

person Regneel    schedule 09.10.2012
comment
чтобы вернуть переменную, а не статическую строку, нужно передать параметр value, как в render_html(self, value) и вернуть mark_safe(value + ' ‹b›больше материала‹/b›'). Мне понадобилось время, чтобы понять это ;-) - person user1255933; 19.02.2014

Если некоторые из ваших данных уже содержат HTML, самое простое решение — использовать TemplateColumn вместо обычного столбца и пометить значение как безопасное:

class Table(tables.Table):
    html_data = tables.TemplateColumn("{{ value|safe }}")
    # ...
person bradley.ayers    schedule 13.09.2012
comment
очень полезно, если данные не определены как свойство. Решение Regneel работает только в том случае, если данные определены как свойство в модели django. - person user1255933; 19.02.2014

ХА. Нашел. Не django-tables2 автоматически экранировал мой контент, а сама система шаблонов django: https://code.djangoproject.com/wiki/AutoEscaping.

Мне пришлось изменить код шаблона, чтобы отобразить django-table2 следующим образом:

{% autoescape off %}
    {% load render_table from django_tables2 %}
    {% render_table route_table %}
{% endautoescape %}
person codemonkey    schedule 11.09.2012
comment
Я действительно согласен. Это взлом. Я почти уверен, что есть какой-то способ использовать шаблон для форматирования содержимого отдельных ячеек, но я не мог на всю жизнь передать связанные данные, когда я пробовал это таким образом. - person codemonkey; 14.09.2012
comment
Я думаю, мой ответ должен был дать понять, что, найдя это, я имел в виду, что выяснил причину поведения и способ его предотвратить. Реальный ответ будет делать что-то другое, кроме отключения автоэкранирования... что является поведением по умолчанию по уважительной причине. - person codemonkey; 14.09.2012