2013-05-23 2 views
1

Я работаю над шаблоном Django, который отображает результаты поиска из поиска в Haystack (я основываю свой шаблон с кодом на http://django-haystack.readthedocs.org/en/latest/tutorial.html#setting-up-the-views). Проблема в том, что запросы могут содержать пробелы (например, я ищу «болезнь Лайма»), и эти пробелы не обрабатываются правильно в URL-адресах.Работа с пробелами в URL-адресах в шаблонах Django

Если я ищу "болезнь Лайма", это URL я получаю:

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

Это нормально. В этом нет ничего плохого. Тем не менее, я использую разбивку на страницы, и у меня есть следующие и предыдущие ссылки, которые я создаю. Я хочу, чтобы следующий пункт:

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 

код шаблона Я использую для создания ссылки Далее это:

{% 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 %} 

Мой вопрос заключается в следующем: как я могу избежать query и request.GET.type, так что пробелы преобразуются обратно в +? Я пробовал теги шаблона escape и force_escape, но они не избегают пробелов. Я знаю there's a hacky way to call str.replace in a template, но есть ли лучший, официальный способ решить эту проблему?


Я забыл упомянуть, что urlencode не работает. Я не уверен, почему, но {{ query|urlencode }} все еще содержит пробелы.

+2

Я думаю, вы должны обновить вопрос отметить, что 'urlencode' фильтр не работает. –

+0

это очень странно :). Просто выстрел в темноте, действительно ли имеет значение 'request.GET.type | safe | urlencode'? – karthikr

+0

Нет, это тоже не работает. – Geoff

ответ

3

Вы можете создать custom template filter:

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

Возможно дополнительное urlencode делает также смысл, если вы не можете гарантировать, что строка будет содержать только URL-адрес безопасные письма! Наиболее элегантным решением было бы создать собственный тег/фильтр шаблона, который генерирует всю строку запроса из QueryDict request.GET, так что вам не нужно иметь дело с конкатенацией строк в самом шаблоне (см., Например, https://pypi.python.org/pypi/django-urltags/).

В качестве альтернативы вы можете также генерировать «следующую» ссылку на ваш взгляд, и передать его в шаблон ...

+0

Мне нравится пользовательская идея фильтра! Думаю, я это сделаю. Благодаря! – Geoff

1

На данный момент я решил проблему, выполнив {{ query.split|join:'+' }}. Он чувствует себя взломанным; Я чувствую, что Django должен иметь встроенный механизм для очистки различных частей URL-адреса. urlencode должен быть тем механизмом, но он не работает.

Я, безусловно, открыт для лучших решений!

Смежные вопросы