URL-кодировка на шаблоне Django - программирование
Подтвердить что ты не робот

URL-кодировка на шаблоне Django

У меня есть эта привязка:

<a href="/question/tag/1/1/?list_id={{title}}">{{title}}</a>

Иногда этот заголовок имеет некоторый контент с + (оператор добавления), например: "Django + Python"

Но когда он будет помещен непосредственно на якорные ссылки, отправленный URL будет:

http://127.0.0.1:8080/question/tag/1/1/?list_id=Django + Python

Что в конечном итоге вызовет проблему при поиске, поскольку декодер url думал, что list_id GET = DjangoPython.

Итак, кто-нибудь знает, как избежать этой проблемы? Обратите внимание, что я не хочу менять привязные ссылки на кнопки ввода.

4b9b3361

Ответ 1

Вместо

{{ title }}

do

{{title|urlencode}}

Ответ 2

Вместо жесткого кодирования URL-адреса и построения запроса в шаблоне путем конкатенации элемента контекста заголовка немного упростите его, используя django.core.urlresolvers.reverse() и указав именованный URL-адрес из соответствующего файла urls.py, Делает для чистого дизайна, когда вам не нужно беспокоиться об изменении URL! Представьте себе головную боль всех разбросанных HREF, которые вам нужно будет изменить, и просто назначьте переменную контекста из представления, установленного на результат обратного вызова. Квитирование может быть добавлено красиво в представлении тоже, не беспокоясь о некоторых часто странных правилах синтаксического шаблона. Обратите внимание, что функция urllib.urlencode действует совершенно иначе, чем шаблонный фильтр с тем же именем; не путайте! Его можно использовать следующим образом:

# If the entry in URLConf has named capture groups such as ?<pk>,
# pass a dict as kwargs parameter instead.
url = reverse('your-named-url', args=(1, 1))  # e.g '/question/tag/1/1/'
# Encodes as form data to 'list_id=Django+%2B+Python'
querystring = urllib.urlencode({'list_id': 'Django + Python'})
context['question_url'] = '{}?{}'.format(url, querystring)

Затем в шаблоне он может быть таким же простым, как href="{{ question_url }}". Это может показаться больше работой, но она может окупиться очень быстро, и это намного лучше разделяет проблемы. Обычно я использую тег шаблона {% url "your-named-url" %}, но в настоящее время он не обрабатывает querystrings красиво - как в, а не так же, как имеет дело с URL-аргументами и kwargs, определенными в URLConf.