Django: есть ли лучший способ выделить жирным шрифтом ссылку на текущую страницу

у меня есть основания.html шаблон, содержащий список ссылок.

пример:

   <div id="sidebar1">
        <ul>
        <li><a href="/" title="">Index</a></li>
        <li><a href="/stuff/" title="" class="current">Stuff</a></li>
        <li><a href="/about/" title="">About Me</a></li>
        <li><a href="/contact/" title="">Contact Me</a></li>
    </div>

тогда у меня в моем views.py определение для каждого индекса.HTML и прочее.HTML-код, около.HTML и контакт.формат html. Каждый из этих шаблонов просто выводится из базы.html шаблон и установить свои собственные соответствующие названия и содержание.

мой вопрос касается выше / вещи, у меня есть класс= "текущий".

Я хотел бы сделать текущую страницу, на которой я нахожусь этот атрибут класса.

я мог бы установить другую переменную в каждом представлении, например current_page= "about", а затем сравнить в шаблоне с {% ifequal %} в каждом элементе класса каждой ссылки, но это похоже на дублирование работы (из-за дополнительной переменной представления).

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

4 ответов


Я назначить id для каждой из моих страниц (или всех страниц в разделе), Как это:

In index.html:    <body id='section-intro'>...
In faq.html:      <body id='section-faq'>...
In download.html: <body id='section-download'>...

и id для соответствующей ссылки:

<li id='nav-intro'><a href="./">Introduction</a></li>
<li id='nav-faq'><a href="./faq.html">FAQ</a></li>
<li id='nav-download'><a href="./download.html">Download</a></li>

и в CSS я установил такое правило:

#section-intro #nav-intro,
#section-faq #nav-faq,
#section-download #nav-download {
    font-weight: bold;
    /* And whatever other styles the current link should have. */
}

таким образом, это работает в основном декларативным способом управления стилем ссылки, которой принадлежит текущая страница. Вы можете увидеть его в действии здесь: http://entrian.com/source-search/

это очень чистая и простая система, как только вы ее настроили, потому что:

  • вам не нужно возиться с разметкой шаблона в ваших ссылках
  • вы не в конечном итоге с помощью big ugly switch заявления или if / else / else заявления
  • добавление страниц в раздел просто работает [TM]
  • изменение способа вещи выглядят только когда-либо означает изменение CSS, а не разметки.

Я не использую Django, но эта система работает в любом месте. В вашем случае, когда вы "устанавливаете свои собственные соответствующие названия и содержимое", вам также нужно установить body id, и нет никакой другой разметки Django не требуется.

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

#section-download #sidebar #download-link {
    display: none;
}

вместо того, чтобы помещать условную разметку шаблона в боковой панели HTML.


не использовали Django, но я имел дело с той же проблемой в Кохана (PHP) и Rails.

что я делаю в Кохане:

<li><a href="/admin/dashboard" <?= (get_class($this) == 'Dashboard_Controller') ? "class=\"active\"" : NULL ?>>Dashboard</a></li>
<li><a href="/admin/campaigns" <?= (get_class($this) == 'Campaigns_Controller') ? "class=\"active\"" : NULL ?>>Campaigns</a></li>
<li><a href="/admin/lists" <?= (get_class($this) == 'Lists_Controller') ? "class=\"active\"" : NULL ?>>Lists</a></li>

что я делаю в Rails:

<li><a href="/main" <%= 'class="active"' if (controller.controller_name == 'main') %>>Overview</a></li>
<li><a href="/notifications" <%= 'class="active"' if (controller.controller_name == 'notifications') %>>Notifications</a></li>
<li><a href="/reports" <%= 'class="active"' if (controller.controller_name == 'reports') %>>Reports</a></li>

Я вижу только несколько способов сделать это, избегая повторных ifequals:

  1. Javascript. Что-то вроде (jQuery):

    var parts = window.location.pathname.split('/');
    var page = parts[parts.length-1];
    $('#sidebar1 a[href*=' + page + ']').addClass('current');
    
  2. измените представления, чтобы содержать список страниц со связанными заголовками и URL-адресами, и создайте цикл {% for %} В шаблоне, который будет проходить через этот список, и добавьте один {% ifequal %}.

Вариант 2 является фаворитом с того места, где я стою. Если логика для всех ваших страниц одинакова, и только шаблоны отличаются, Вы можете использовать модель FlatPages для каждой из ваших страниц. Если логика отличается, и вам нужны разные модели, вы можете рассмотреть возможность использования приложения menuing. Бесстыдная пробка: у меня есть menuing приложение моего собственного


если добавить request контекстный процессор, это довольно просто:

settings.py:

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.request',
    'django.contrib.auth.context_processors.auth'  # admin app wants this too
)

теперь у вас есть доступ к HttpRequest, который содержит путь запроса. Выделение текущей страницы-это простой вопрос проверки того, соответствует ли путь назначению ссылки, т. е. вы уже там:

<li><a class="{% if request.path == '/' %}current{% endif %}" href="/">Index</a></li>
<li><a class="{% if request.path == '/stuff/' %}current{% endif %}" href="/stuff/">Stuff</a></li>
<li><a class="{% if request.path == '/about/' %}current{% endif %}" href="/about/">About Me</a></li>
<li><a class="{% if request.path == '/contact/' %}current{% endif %}" href="/contact/">Contact Me</a></li>