在Django模板中处理URL中的空格

时间:2013-05-23 19:38:08

标签: django django-templates django-haystack

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

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

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

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

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 }}仍然包含空格。

2 个答案:

答案 0 :(得分:3)

您可以创建custom template filter

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

如果你不能保证字符串只包含url安全字母,那么额外的urlencode也是有意义的!最优雅的解决方案是创建一个自定义模板标记/过滤器,它从request.GET QueryDict中生成整个查询字符串,这样您就不必在模板本身中处理字符串连接(参见例如。 https://pypi.python.org/pypi/django-urltags/)。

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

答案 1 :(得分:1)

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

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