Тег шаблона Django для вставки или замены параметра URL

Кто-нибудь знает тег шаблона Django, который принимает текущий путь и строку запроса и вставляет или заменяет значение строки запроса?

например. заданный запрос /some/custom/path? q = how + now + brown + cow & page = 3 & filter = person

Вызов {% urlparam 'page' 4 %} будет генерировать /some/custom/path?q=how+now+brown+cow&page=4&filter=person.

Это было бы не так сложно писать с нуля, но поскольку это кажется очень распространенной задачей, я бы ожидал, что такой тег будет встроен. Однако, прочитав docs и googling, я не могу найти никого, кто опубликовал бы такой тег.

3 ответа

Поскольку я не использовал эти инструменты самостоятельно, я просто отсылаю вас:

FYI, я лично использовал jsurl библиотеку для подобных манипуляций с URL в javascript.

Надеюсь, что это поможет.


Я хочу сделать серию ссылок на страницы на странице поиска. URL содержит несколько параметров запроса (например, в моем примере). код разбивки на страницы, который отображает ссылки на страницы, не должен быть явно заданы все эти параметры. Администратор Django, похоже, это поведение везде.

Это активируется добавлением django.core.context_processors.request к TEMPLATE_CONTEXT_PROCESSORS (по умолчанию он не включен). Это добавит переменную request к вашим шаблонам, которая представляет собой HttpRequest объект.

Оттуда вы можете использовать {{ request.get_full_path }}, чтобы получить текущий URL-адрес с полной строкой запроса, а затем добавить к нему свой пользовательский запрос.

Если ваша страница /search?q=foo+bar, и вы хотите, чтобы новая ссылка была /search?q=foo+bar&page=4, <a href="{{ request.get_full_path }}&page=4">page 4</a>.


Вот как я это сделал в проекте Django 1.3. Как и вы, я ожидал найти это встроенное, но в конечном итоге его кодировал в представлении:

def remove_url_param(url, params):
 if not isinstance(params, list):
 params = [params,]
 if isinstance(url, unicode):
 # urlencode doesn't like unicode
 url = url.encode('utf8')
 (scheme, netloc, path, query, fragment) = urlparse.urlsplit(url)
 param_dict = parse_qs(query)
 for p in params:
 try:
 del(param_dict[p])
 except KeyError:
 pass
 query = urllib.urlencode(param_dict, True)
 return urlparse.urlunsplit((scheme, netloc, path, query, fragment))

Затем я использовал это для создания базовых URL-адресов:

page_url_unordered = putils.remove_url_param( request.get_full_path(), ['order', 'ajax'] )

Затем в шаблоне:

<a href="{{ page_url_unordered }}&order=price">Price</a>
<a href="{{ page_url_unordered }}&order=size">Size</a>

licensed under cc by-sa 3.0 with attribution.