Шаблоны Django: сравнение текущего URL с {% url xyz%} - PullRequest
11 голосов
/ 29 сентября 2011

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

Я пытаюсь сделать что-то вроде этого:

<li {% if request.get_full_path == {% url profile_edit_personal %} %}class="current"{% endif %}><a href="{% url profile_edit_personal %}">Personal Details</a></li>

В качестве альтернативы, я знаю, что могу определить, сделать что-то вроде этого:

<li class="{% block current %}{% endblock %}"><a href="{% url profile_edit_personal %}">Personal Details</a></li>

и добавьте {% block current %}current{% endblock %} к каждому из соответствующих шаблонов, но я бы предпочел что-то вроде того, что я пытаюсь достичь в первом примере, если это возможно

Спасибо!

Ответы [ 3 ]

17 голосов
/ 17 мая 2012

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

Сначала поменяйте имена URL-адресов и сохраните их вПеременные, как предложил Тимми, просто сравните их в шаблоне:

{% url 'about_page' as about %}
...

<ul id="nav">
    <li class="{% ifequal request.path about %}active{% endifequal %}"><a href="{{about}}">About</a></li>
...

Просто убедитесь, что у вас включен обработчик контекста запроса, чтобы у вас был доступ к запросу в шаблоне.Сделайте это, добавив django.core.context_processors.debug в переменную TEMPLATE_CONTEXT_PROCESSORS.

6 голосов
/ 29 сентября 2011

Это довольно распространенное требование, поэтому стоит написать собственный тег шаблона, чтобы выполнить это:

class isCurrentNode(template.Node):
    def __init__(self, patterns):
        self.patterns = patterns
    def render(self, context):
        path = context['request'].path
        for pattern in self.patterns:
            curr_pattern = template.Variable(pattern).resolve(context)
            if path == curr_pattern:
        return "current"
            return ""

@register.tag
def is_current(parser, token):
    """ Check if the browse is currently at this supplied url"""
    args = token.split_contents()
    if len(args) < 2:
        raise template.TemplateSyntaxError, "%r tag requires at least one argument" % args[0]
    return isCurrentNode(args[1:])

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

{% url about_page as about %}
{% url home_page as home %}
...

<ul>
    <li class="{% is_current home %}"><a href="{{ home }}">Home</a></li>
    <li class="{% is_current about %}"><a href="{{ about }}">About</a></li>
    ...

Вот та же идея, сделанная немного по-другому:

http://gnuvince.wordpress.com/2007/09/14/a-django-template-tag-for-the-current-active-page/ http://www.turnkeylinux.org/blog/django-navbar

3 голосов
/ 29 сентября 2011

Как насчет:

<li {% if request.get_full_path == profile_edit_personal.get_absolute_url %}
    class="current"{% endif %}><a href="{% url profile_edit_personal %}">
    Personal Details</a></li>

, где get_absolute_url, как описано в документации Django.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...