2010-04-19 4 views
1

Может кто-нибудь, пожалуйста, помогите мне выяснить способ достижения следующего (см. Ниже фрагменты) в шаблонах Django? Я знаю, что вы не можете использовать более одного расширения, но я новичок в django, и я не знаю правильного синтаксиса для чего-то подобного. Я хочу, чтобы иметь возможность сделать это, чтобы я мог использовать мой макет вложенных div для CSS-причин, не набирая их так и каждый раз и рискуя опечатками. На словах я хочу, чтобы шаблон страницы расширил мой файл base.html, а затем использовал html-фрагменты содержимого динамического шаблона (т. Е. Шаблон для циклов или других логических устройств шаблонов, а не только переменную контекста, которую я установил из моего контроллера представления).Как использовать фрагменты html-блока с динамическим содержимым внутри шаблона django, который расширяет другой файл?


редактировать: Я хочу, чтобы иметь возможность отображать произвольное содержание произвольным образом в каждом столбце. Например, я хотел бы иметь возможность отображать ul изображений в одном столбце, а затем на той же странице показывать другой набор столбцов, отображающих таблицу данных. Вот пример того, что я напечатал: example of alot of random columns


Я понимаю, что пример картина имеет весь текст генерируется из выходного Джанго веб-тестера, но каждый coulmn должен быть в состоянии иметь случайный контент. И они должны быть гнездовыми. Возможно ли это с использованием языка шаблонов django по умолчанию?

------------------------------------------------------------ 
base.html 
------------------------------------------------------------ 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> 
     <title>{% block title %}Title{% endblock %}</title> 
    </head> 
    <body> 
     <div class="wrapper"> 
      <div class="header"> 
       This is the common header 
      </div> 
      <div class="nav"> 
       This is the common nav    
      </div> 
      {% if messages %} 
       <div class="messages"> 
        <ul> 
         {% for message in messages %} 
         <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li> 
         {% endfor %} 
        </ul> 
       </div> 
      {% endif %} 
      <div class="content"> 
       {% block content %}Page Content{% endblock %} 
      </div> 
      <div class="footer"> 
       This is the common footer 
      </div> 
     </div> 
    </body> 
</html> 
------------------------------------------------------------ 
columnlayout2.html 
------------------------------------------------------------ 
<div class="twocol container2"> 
    <div class="container1"> 
     <div class="col1"> 
      {% block twocol_col1 %}{% endblock %} 
     </div> 
     <div class="col2"> 
      {% block twocol_col2 %}{% endblock %} 
     </div> 
    </div> 
</div> 

------------------------------------------------------------ 
columnlayout3.html 
------------------------------------------------------------ 
<div class="threecol container3"> 
    <div class="container2"> 
     <div class="container1"> 
      <div class="col1"> 
       {% block threecol_col1 %}{% endblock %} 
      </div> 
      <div class="col2"> 
       {% block threecol_col2 %}{% endblock %} 
      </div> 
      <div class="col3"> 
       {% block threecol_col3 %}{% endblock %} 
      </div> 
     </div> 
    </div> 
</div> 

------------------------------------------------------------ 
page.html 
------------------------------------------------------------ 
{% extends "base.html" %} 

{% block content %} 

    {% extends "columnlayout2.html" %} 
     {% block twocol_col1 %}twocolumn column 1{% endblock %} 
     {% block twocol_col2 %}twocolumn column 2{% endblock %} 

    {% extends "columnlayout3.html" %} 
     {% block threecol_col1 %}threecol column 1{% endblock %} 
     {% block threecol_col2 %}threecol column 2{% endblock %} 
     {% block threecol_col3 %}threecol column 3{% endblock %} 

{% endblock %} 

------------------------------------------------------------ 
page.html output 
------------------------------------------------------------ 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> 
     <title>Title</title> 
    </head> 
    <body> 
     <div class="wrapper"> 
      <div class="header"> 
       This is the common header 
      </div> 
      <div class="nav"> 
       This is the common nav    
      </div> 
      <div class="content"> 
       <div class="twocol container2"> 
        <div class="container1"> 
         <div class="col1"> 
          twocolumn column 1 
         </div> 
         <div class="col2"> 
          twocolumn column 2 
         </div> 
        </div> 
       </div> 
       <div class="threecol container3"> 
        <div class="container2"> 
         <div class="container1"> 
          <div class="col1"> 
           threecol column 1 
          </div> 
          <div class="col2"> 
           threecol column 2 
          </div> 
          <div class="col3"> 
           threecol column 3 
          </div> 
         </div> 
        </div> 
       </div> 
      </div> 
      <div class="footer"> 
       This is the common footer 
      </div> 
     </div> 
    </body> 
</html> 
+0

Звучит как [теги включения] (http://docs.djangoproject.com/en/1.1/howto/custom-template-tags/#inclusion-tags) - это то, что вам нужно. –

ответ

1

Я согласен с Даниилом, теги включения, вероятно, что вы после этого, и я думаю, вы непонимание их и {% extends %}.

Если содержание является статическим или в контексте, вы можете использовать {% включают%} блоки, как

{% block content %} 
    {% include "columnlayout2.html" %} 
    {% include "columnlayout3.html" %} 
{% endblock %} 

, чтобы вы могли хранить содержимое вы хотите в чем-то вроде {{two_columns}} и {{ three_columns}} и сделать

------------------------------------------------------------ 
columnlayout2.html 
------------------------------------------------------------ 
<div class="twocol container2"> 
    <div class="container1"> 
     <div class="col1"> 
      {{ two_columns[0] }} 
     </div> 
     <div class="col2"> 
      {{ two_columns[1] }} 
     </div> 
    </div> 
</div> 

Или вы можете использовать теги включения в page.html

EDIT

Модератор должен визуализировать HTML с другой структурой (а не только контентом) на разных страницах, поэтому вы можете сделать что-то вроде вызовов «вложенности» в теги включения.

{% block content %} 
    {% show_two_columns two_columns %} 
    {% show_three_columns three_columns %} 
{% endblock %} 

templatetag

@register.inclusion_tag("columns/two_columns.html") 
def show_two_columns(columns): 
    return {'columns': columns} 

two_columns.html

<div class="twocol container2"> 
    <div class="container1"> 
     <div class="col1"> 
      {% render_column columns[0] %} 
     </div> 
     <div class="col2"> 
      {% render_column columns[1] %} 
     </div> 
    </div> 
</div> 

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

+0

Хорошо. Я отметил это как ответ. Как вы манипулируете списком/запросом/данными, которые вы передаете через фильтр include в файле page.html? Я хочу иметь возможность использовать фрагменты столбцов в нескольких разных шаблонах страниц, поэтому данные, прошедшие через фильтр include, уже должны быть отформатированы в html. – user319862

+0

А я вижу. Это правда, что вы не хотите создавать какой-либо HTML-код в своих представлениях. Является ли HTML полностью разным каждый раз? –

+0

Да, это ... =/вот что дает мне головные боли. – user319862