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

发布于 2024-10-24 00:54:17 字数 802 浏览 3 评论 0原文

我使用 request.path 来获取当前 URL。例如,如果当前 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。

I use request.path to obtain the current URL. For example if the current URL is "/test/foo/baz" I want to know if it starts with a string sequence, let's say /test. If I try to use:

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

I get an error saying that it could not parse the remainder of the expression:

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

One solution would be to create a custom tag to do the job. Is there something else existing to solve my problem? The Django version used is 1.0.4.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

贱贱哒 2024-10-31 00:54:17

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

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

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

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

You can use the slice filter to get the first part of the url

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

Cannot try this now, and don't know if filters work inside 'if' tag,
if doesn't work you can use the 'with' tag

{% with request.path|slice:":5" as path %}
  {% if path == '/test' %}
    Test
  {% endif %} 
{% endwith %} 
伊面 2024-10-31 00:54:17

您可以通过使用内置 in 标记检查成员身份来获得相同的结果,而不是使用startswith 检查前缀。

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

这将绕过字符串不严格位于开头的情况,但您可以简单地避免这些类型的 URL。

Instead of checking for the prefix with startswith, you can get the same thing by checking for membership with the builtin in tag.

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

This will pass cases where the string is not strictly in the beginning, but you can simply avoid those types of URLs.

清秋悲枫 2024-10-31 00:54:17

您无法从 django 模板中将参数传递给普通的 python 函数。为了解决您的问题,您需要一个自定义模板标签: http://djangosnippets.org/snippets/806/

You can not pass arguments to normal python functions from within a django template. To solve you problem you will need a custom template tag: http://djangosnippets.org/snippets/806/

帝王念 2024-10-31 00:54:17

根据设计,您不能使用 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'),这可能会有所帮助。

You can't, by design, call functions with arguments from Django templates.

One easy approach is to put the state you need in your request context, like this:

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

Then you will have an is_test variable you can use in your template:

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

This approach also has the advantage of abstracting the exact path test ('/test') out of your template, which may be helpful.

与往事干杯 2024-10-31 00:54:17

Django 文档的此页面中的哲学部分:

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

您确实应该编写一个自定义标记或传递一个变量来通知模板路径是否以 '/test' 开头

From the Philosophy section in this page of Django docs:

the template system will not execute
arbitrary Python expressions

You really should write a custom tag or pass a variable to inform the template if the path starts with '/test'

っ〆星空下的拥抱 2024-10-31 00:54:17

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

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

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

*. 将 settings.py 中的记录添加

'core.context_processors.variables',

到 TEMPLATES 'context_processors' 列表中。

*。 使用。

{{ url_part_1 }}

在任何模板中

I use context processor in such case:

*. Create file core/context_processors.py with:

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

*. Add record:

'core.context_processors.variables',

in settings.py to TEMPLATES 'context_processors' list.

*. Use

{{ url_part_1 }}

in any template.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文