从Django模板获取URL的第一部分

时间:2011-03-18 13:12:51

标签: python django templates url django-templates

我使用request.path获取当前网址。例如,如果当前URL是“/ test / foo / baz”,我想知道它是否以字符串序列开头,让我们说/ test。如果我尝试使用:

{% if request.path.startswith('/test') %}
    Test
{% endif %} 

我收到一条错误消息,说它无法解析表达式的其余部分:

Could not parse the remainder: '('/test')' from 'request.path.startswith('/test')'
Request Method: GET
Request URL:    http://localhost:8021/test/foo/baz/
Exception Type: TemplateSyntaxError
Exception Value:    
Could not parse the remainder: '('/test')' from 'request.path.startswith('/test')'
Exception Location: C:\Python25\lib\site-packages\django\template\__init__.py in   __init__, line 528
Python Executable:  C:\Python25\python.exe
Python Version: 2.5.4
Template error

一种解决方案是创建自定义标签来完成工作。还有其他东西可以解决我的问题吗?使用的Django版本是1.0.4。

6 个答案:

答案 0 :(得分:56)

您可以使用切片过滤器来获取网址的第一部分

{% if request.path|slice:":5" == '/test' %}
    Test
{% endif %} 

现在无法尝试,并且不知道过滤器是否在'if'标签内工作, 如果不起作用,您可以使用'with'标记

{% with request.path|slice:":5" as path %}
  {% if path == '/test' %}
    Test
  {% endif %} 
{% endwith %} 

答案 1 :(得分:26)

不是使用startswith检查前缀,而是通过检查内置in标记的成员资格来获得相同的内容。

{% if '/test' in request.path %}
    Test
{% endif %} 

这将传递字符串不严格在开头的情况,但您可以简单地避免使用这些类型的URL。

答案 2 :(得分:5)

您不能在django模板中将参数传递给普通的python函数。要解决您的问题,您需要一个自定义模板代码:http://djangosnippets.org/snippets/806/

答案 3 :(得分:3)

根据设计,您不能使用Django模板中的参数调用函数。

一种简单的方法是将您需要的状态放在请求上下文中,如下所示:

def index(request):
    c = {'is_test' : request.path.startswith('/test')}
    return render_to_response('index.html', c, context_instance=RequestContext(request))

然后您将在模板中使用is_test变量:

{% if is_test %}
    Test
{% endif %}

此方法还具有从模板中抽象出精确路径测试('/ test')的优势,这可能会有所帮助。

答案 4 :(得分:0)

来自this page of Django docs中的哲学部分:

  

模板系统不会执行   任意Python表达式

如果路径以'/test'开头

,您真的应该编写自定义标记或传递变量来通知模板

答案 5 :(得分:0)

我在这种情况下使用上下文处理器:

*。使用以下命令创建文件core / context_processors.py:

def variables(request):
        url_parts = request.path.split('/')
        return {
            'url_part_1': url_parts[1],
        }

*。添加记录:

'core.context_processors.variables',

在settings.py到TEMPLATES' context_processors'列表。

*。使用

{{ url_part_1 }}

在任何模板中。