шаблон тегов django, объедините вызов метода {{}} с контекстной переменной тега шаблона - PullRequest
0 голосов
/ 24 декабря 2009

Я пытаюсь сделать результат тега шаблона зависимым от другого тега шаблона. Вариант использования следующий. у меня есть список заголовков, который содержит все столбцы, которые я хочу показать в таблице + столбец модели, которую они показывают + видны ли они или нет.

LIST_HEADERS = (
    ('Title', 'title', True),
    ('First Name', 'first_name', True),
    ('Last Name', 'last_name', True),
    ('Modified At', 'modified', False),
)

Теперь у меня есть тег шаблона, который распечатывает все заголовки. следовательно, я хотел создать тег шаблона, который распечатывает тело таблицы. поэтому я хочу взять список заголовков и проверить, какой заголовок видим, и хочу, соответственно, показать или скрыть мое значение.

поэтому я создал шаблон шаблона тега ниже:

<tr class="{% cycle odd,even %}">
  {% for header in headers %}
  {% if header.visible %}
    <td><a href="{{ model_instance.get_absolute_url|escape }}">{{ model_instance.title }}</a></td>
  {% else %}
    <td style="visibility:hidden;"><a href="{{ model_instance.get_absolute_url|escape }}">{{ model_instance.title }}</a></td>
  {% endif %}
  {% endfor %}
</tr>

вы видите значение {{model_instance.title}} там. это значение я хочу изменить на model_instance.title, model_instance.first_name, model_instance.last_name, ... во время выполнения.

, таким образом, я ищу способ объединить {{model_instance}} с header.model_column.

model_column соответствует второй записи в LIST_HEADERS. Таким образом, model_column будет title, first_name, ..

таким образом, решение будет выглядеть как [псевдокод] {{model_instance.header.model_column}} [псевдокод]

.. таким образом я ищу способ, которым я могу объединить вызов метода шаблона django с атрибутом тега шаблона django ... хм .. звучит безумно: D

Надеюсь, я объяснил это достаточно хорошо! вероятно, есть гораздо более простое решение моей проблемы. но это кажется мне довольно общим и легким и будет работать.

Ответы [ 2 ]

2 голосов
/ 24 декабря 2009

Упростите это.

Сначала прочитайте о том, что на самом деле язык шаблонов Django может делать. Это не много. Может обрабатывать переменные, списки и словари.

Проще, если вы выполняете всю "работу" в функции просмотра.

show = [ ]
for  title, field_name, visible in LIST_HEADERS:
     if visible: style= "visibility:hidden"
     else: style= ""
     show.append( (style, title, getattr(object,field_name) )
render_to_response( "template", { 'show_list': show, ... }, ... )

В вашем шаблоне

{% for style, name, value in show_list %}
<tr class="{% cycle odd,even %}">
    <td class="{{style}}"><a href="...">{{value}}</a></td>
{% endfor %}

Действительно, я бы предложил исключить LIST_HEADERS из вашей функции просмотра.

show = [ 
    ("", 'Title', object.title),
    ("",'First Name', object.first_name),
    ("",'Last Name', object.last_name),
    ("visibility:hidden",'Modified At', object.modified),
]
render_to_response( "template", { 'show_list': show, ... }, ... )

Я считаю, что с этим гораздо проще работать, потому что он явный и находится в функции представления.

2 голосов
/ 24 декабря 2009

Я бы сделал это как фильтр, так как они предоставляют простой способ визуализации результата в зависимости от значения переменной.

@register.filter
def field_from_name(instance, field_name):
    return getattr(instance, field_name, None)

и затем в шаблоне:

{{ model_instance|field_from_name:header.model_column }} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...