Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django模板:将当前url与{%url xyz%}进行比较_Django_Django Templates - Fatal编程技术网

Django模板:将当前url与{%url xyz%}进行比较

Django模板:将当前url与{%url xyz%}进行比较,django,django-templates,Django,Django Templates,我正在尝试根据用户所在的当前页面更改导航链接的活动选择 我正试图做这样的事情: <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="{% bloc

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

我正试图做这样的事情:

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

或者,我知道我可以这样做:

<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%}
    添加到每个相关模板中,但如果可能的话,我更喜欢像我在第一个示例中尝试实现的那样

    谢谢

    那么:

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

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

    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:])
    
    class isCurrentNode(template.Node):
    定义初始化(自,模式):
    self.patterns=模式
    def呈现(自身、上下文):
    路径=上下文['request']。路径
    对于self.patterns中的模式:
    curr\u pattern=template.Variable(pattern).resolve(context)
    如果路径==当前模式:
    返回“当前”
    返回“”
    @register.tag
    def是_当前(解析器、令牌):
    “”“检查浏览当前是否位于此提供的url”“”
    args=token.split_contents()
    如果len(args)<2:
    raise template.TemplateSyntaxError,“%r”标记至少需要一个参数“%args[0]
    返回isCurrentNode(参数[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>
        ...
    
    {%url关于\页面作为关于%}
    {%url主页\作为主页%}
    ...
    
    • ...
    以下是相同的想法,但有点不同:


    http://www.turnkeylinux.org/blog/django-navbar

    因为您可能只需要在导航模板中执行一次,所以对我来说,将所有内容都放在一个地方更有意义

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

    {% url 'about_page' as about %}
    ...
    
    <ul id="nav">
        <li class="{% ifequal request.path about %}active{% endifequal %}"><a href="{{about}}">About</a></li>
    ...
    
    {%url'关于页面'作为关于%}
    ...
    
    • ...
    只需确保已启用请求上下文处理器,以便可以访问模板中的请求。通过在
    TEMPLATE\u context\u processors
    settings变量中添加
    django.core.context\u processors.debug
    来完成此操作