【问题标题】:dealing with spaces in URLs in Django's templates在 Django 模板中处理 URL 中的空格
【发布时间】:2013-05-23 19:38:08
【问题描述】:

我正在开发一个 Django 模板,该模板显示来自 Haystack 搜索的搜索结果(我的模板基于 http://django-haystack.readthedocs.org/en/latest/tutorial.html#setting-up-the-views 的代码)。问题是查询可能包含空格(例如,我搜索“莱姆病”),而这些空格在 URL 中没有得到正确处理。

如果我搜索“莱姆病”,这是我得到的 URL:

http://www.site.com/search/?q=lyme+disease&type=All+Types

没关系。这没什么不好。但是,我正在使用分页,并且我已经建立了下一个和上一个链接。我想要的是让 Next 指向:

http://www.site.com/search/?q=lyme+disease&type=All+Types&page=2

但是,事实并非如此。我得到的链接是这样的:

http://www.site.com/search/?q=lyme disease&type=All Types&page=2

我用来生成 Next 链接的模板代码是这样的:

{% if page.has_next %}<a href="?q={{ query }}&amp;type={{ request.GET.type }}&amp;page={{ page.next_page_number }}">{% endif %}Next &raquo;{% if page.has_next %}</a>{% endif %}

我的问题是:我怎样才能逃脱queryrequest.GET.type 以便将空格转换回+?我试过escapeforce_escape 模板标签,但它们不会转义空格。我知道there's a hacky way to call str.replace in a template,但是有没有更好的官方方法来解决这个问题?

[编辑]
我忘了提到urlencode 不起作用。我不知道为什么,但{{ query|urlencode }} 仍然包含空格。

【问题讨论】:

  • 我认为您应该更新问题以提及 urlencode 过滤器不起作用。
  • 这很奇怪:)。只是在黑暗中拍摄,request.GET.type|safe|urlencode 有什么不同吗?
  • 不,这也不起作用。
  • 我刚试过{{ query.split|join:'+' }},确实有效。这真的很hacky。 Django 肯定已经有办法处理 URL 中的空格了,对吧?

标签: django django-templates django-haystack


【解决方案1】:

你可以创建一个custom template filter:

@register.filter
def remove_spaces(value):
    return value.replace(' ', '+')

如果您不能保证字符串仅包含 url 安全字母,那么额外的 urlencode 可能也有意义!最优雅的解决方案是制作一个自定义模板标签/过滤器,它从request.GETQueryDict 中生成整个查询字符串,这样您就不必处理模板本身中的字符串连接(参见例如@987654322 @)。

作为替代方案,您还可以在视图中生成“下一个”链接并将其传递给您的模板...

【讨论】:

  • 我喜欢自定义过滤器的想法!我想我会那样做。谢谢!
【解决方案2】:

目前,我通过{{ query.split|join:'+' }} 解决了这个问题。感觉很老套;我觉得 Django 应该有一个内置机制来清理 URL 的各个部分。 urlencode 应该是那个机制,但它不起作用。

我当然愿意接受更好的解决方案!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 2021-07-12
    • 2022-12-10
    • 2019-01-08
    • 2013-01-22
    相关资源
    最近更新 更多