Подтвердить что ты не робот

Как добавить текущую строку запроса к URL-адресу в шаблоне Django?

Когда я загружаю страницу, есть ссылка "sameLink", которую я хочу добавить к ней строкой запроса ее содержащей страницы.

У меня есть следующий URL:

somedomain/reporting/article-by-month?variable1=2008

Как я могу это сделать?

4b9b3361

Ответ 1

Чтобы захватить QUERY_PARAMS, которые были частью запроса, вы ссылаетесь на dict, который содержит эти параметры (request.GET) и urlencode, чтобы они были приемлемыми как часть href. request.GET.urlencode возвращает строку, которая выглядит как ds=&date_published__year=2008, которую вы можете поместить в ссылку на странице следующим образом:

<a href="sameLink/?{{ request.GET.urlencode }}">

Ответ 2

Если вы зарегистрируете templatetag, как показано ниже:

@register.simple_tag
def query_transform(request, **kwargs):
    updated = request.GET.copy()
    updated.update(kwargs)
    return updated.urlencode()

вы можете изменить строку запроса в своем шаблоне:

<a href="{% url 'view_name' %}?{% query_transform request a=5 b=6 %}">

Это сохранит что-либо уже в строке запроса и просто обновит указанные вами ключи.

Ответ 3

Я обнаружил, что ответ @Michael не совсем работает, когда вы хотите обновить существующий параметр запроса.

Следующие работали для меня:

@register.simple_tag
def query_transform(request, **kwargs):
    updated = request.GET.copy()
    for k, v in kwargs.iteritems():
        updated[k] = v

    return updated.urlencode()

Ответ 4

Следуя за @Prydie (спасибо!), я хотел сделать то же самое, но в Python 3 и Django 1.10 с добавлением возможности стирания клавиш запроса и их модификации. Для этого я использую это:

@register.simple_tag
def query_transform(request, **kwargs):
    updated = request.GET.copy()
    for k, v in kwargs.items():
        if v is not None:
            updated[k] = v
        else:
            updated.pop(k, 0)  # Remove or return 0 - aka, delete safely this key

    return updated.urlencode()

Третий бит python kwargs.items() поверх .iteritems()

Ответ 5

Сообщается другими ответами, но не нуждается в передаче request и обновляет только существующие параметры.

@register.simple_tag(takes_context=True)
def querystring(context, **kwargs):
    """
    Creates a URL (containing only the querystring [including "?"]) derived
    from the current URL querystring, by updating it with the provided
    keyword arguments.

    Example (imagine URL is ``/abc/?gender=male&name=Tim``)::

        {% querystring "name"="Diego" "age"=20 %}
        ?name=Diego&gender=male&age=20
    """
    request = context['request']
    updated = request.GET.copy()
    for k, v in kwargs.items():  # have to iterate over and not use .update as it a QueryDict not a dict
        updated[k] = v

    return '?{}'.format(updated.urlencode()) if updated else ''