【问题标题】:Django Templates: Comparing current url with {% url xyz %}Django 模板:将当前 url 与 {% url xyz %} 进行比较
【发布时间】:2011-09-29 07:06:02
【问题描述】:

我正在尝试根据用户所在的当前页面更改我的导航链接的活动选择。

我正在尝试做这样的事情:

<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 %},但如果可能的话,我更喜欢我在第一个示例中尝试实现的目标

谢谢!

【问题讨论】:

    标签: django django-templates


    【解决方案1】:

    由于您可能只需要在导航模板中执行一次此操作,因此将所有内容保存在一个位置对我来说更有意义。

    首先反转你的 url 名称并将它们存储在 Timmy 建议的变量中,然后在模板中简单地比较它们:

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

    只需确保您启用了请求上下文处理器,以便您可以访问模板中的请求。为此,请在您的 TEMPLATE_CONTEXT_PROCESSORS 设置变量中添加 django.core.context_processors.debug

    【讨论】:

      【解决方案2】:

      这是一个很常见的要求,因此可能值得编写自己的模板标签来执行此操作:

      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】:

        怎么样:

        <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 技巧可以在没有那么多代码的情况下做到这一点。我想说更多,但今天早上只喝了半杯咖啡..

        【讨论】:

          猜你喜欢
          • 2012-05-03
          • 1970-01-01
          • 2019-01-19
          • 2019-10-10
          • 1970-01-01
          • 2013-04-06
          • 2020-02-08
          • 2012-07-12
          • 2014-02-18
          相关资源
          最近更新 更多