Изменение одного параметра запроса в URL (Django) - PullRequest
16 голосов
/ 22 апреля 2011

У меня есть страница поиска, которая принимает различные параметры.Я хочу создать новый URL, просто изменив один параметр в запросе.Есть ли простой способ сделать это - что-то вроде:

# example request url
http://example.com/search?q=foo&option=bar&option2=baz&change=before

# ideal template code
{% url_with change 'after' %}

# resulting url
http://example.com/search?q=foo&option=bar&option2=baz&change=after

Так что это будет принимать URL-адрес запроса, изменить один параметр запроса и затем вернуть новый URL-адрес.Подобно тому, что может быть достигнуто в Perl's Catalyst с использованием $c->uri_with({change => 'after'}).

Или есть лучший способ?

[ОБНОВЛЕНО: удалены ссылки на нумерацию страниц]

Ответы [ 7 ]

17 голосов
/ 17 мая 2013

Я сделал этот простой тег, который не требует дополнительных библиотек:

@register.simple_tag
def url_replace(request, field, value):

    dict_ = request.GET.copy()

    dict_[field] = value

    return dict_.urlencode()

Использовать как:

<a href="?{% url_replace request 'param' value %}">

Он добавит 'param' к вашей строке GET url, еслиего нет или замените его новым значением, если оно уже есть.

Вам также необходимо, чтобы экземпляр запроса RequestContext был предоставлен вашему шаблону из вашего представления.Больше информации здесь:

http://lincolnloop.com/blog/2008/may/10/getting-requestcontext-your-templates/

15 голосов
/ 14 сентября 2012

Итак, напишите тег шаблона вокруг этого:

from urlparse import urlparse, urlunparse
from django.http import QueryDict

def replace_query_param(url, attr, val):
    (scheme, netloc, path, params, query, fragment) = urlparse(url)
    query_dict = QueryDict(query).copy()
    query_dict[attr] = val
    query = query_dict.urlencode()
    return urlunparse((scheme, netloc, path, params, query, fragment))

Для более комплексного решения используйте URLObject 2 Захари Воазе, что очень хорошо сделано.

Примечание: Модуль urlparse переименован в urllib.parse в Python 3.

10 голосов
/ 12 июня 2013

Я улучшил решение mpaf, чтобы получать запрос прямо из тега.

@register.simple_tag(takes_context = True)
def url_replace(context, field, value):
    dict_ = context['request'].GET.copy()
    dict_[field] = value
    return dict_.urlencode()
2 голосов
/ 18 июля 2015

Это сработало очень хорошо для меня. Позволяет установить любое количество параметров в URL. Работает хорошо для пейджера, сохраняя остальную часть строки запроса.

from django import template
from urlobject import URLObject

register = template.Library()

@register.simple_tag(takes_context=True)
def url_set_param(context, **kwargs):
    url = URLObject(context.request.get_full_path())
    path = url.path
    query = url.query
    for k, v in kwargs.items():
        query = query.set_param(k, v)
    return '{}?{}'.format(path, query)

Тогда в шаблоне:

<a href="{% url_set_param page=last %}">
1 голос
/ 22 апреля 2011

Существует несколько тегов шаблонов для изменения строки запроса djangosnippets.org:

http://djangosnippets.org/snippets/553/
http://djangosnippets.org/snippets/826/
http://djangosnippets.org/snippets/1243/

Я бы сказал, что этиявляются наиболее перспективными.Один из моментов во всех них заключается в том, что вы должны использовать django.core.context_processors.request в своем TEMPLATE_CONTEXT_PROCESSORS.

0 голосов
/ 19 октября 2012

В дополнение к фрагментам, упомянутым Марком Лавином, вот список других реализаций, которые я мог найти для тега шаблона Django, который изменяет текущую строку запроса HTTP GET.

на djangosnippets.org:

В PyPI:

На GitHub:

0 голосов
/ 22 апреля 2011

Вы можете попробовать https://github.com/dcramer/django-paging

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...