Как добавить текущую строку запроса в URL в шаблоне Django? - PullRequest
43 голосов
/ 23 июня 2011

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

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

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

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

Ответы [ 6 ]

110 голосов
/ 23 июня 2011

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

<a href="sameLink/?{{ request.GET.urlencode }}">
14 голосов
/ 10 июня 2014

Если вы зарегистрируете тег шаблона следующим образом:

@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 %}">

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

11 голосов
/ 09 июля 2014

Я обнаружил, что ответ @ 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()
2 голосов
/ 28 марта 2017

Исходя из @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()

3-битный питон, являющийся kwargs.items() более .iteritems()

1 голос
/ 20 марта 2018

Основываясь на решении @ Prydie (которое само использует @ Michael's), я сконструировал тег для возврата полного URL-адреса, а не только строки параметра.

My myproject / template_tags.py

from django import template


register = template.Library()


# https://stackoverflow.com/a/24658162/2689986
@register.simple_tag
def add_query_params(request, **kwargs):
    """
    Takes a request and generates URL with given kwargs as query parameters
    e.g.
    1. {% add_query_params request key=value %} with request.path=='/ask/'
        => '/ask/?key=value'
    2. {% add_query_params request page=2 %} with request.path=='/ask/?key=value'
        => '/ask/?key=value&page=2'
    3. {% add_query_params request page=5 %} with request.path=='/ask/?page=2'
        => '/ask/?page=5'
    """
    updated = request.GET.copy()
    for k, v in kwargs.items():
        updated[k] = v

    return request.build_absolute_uri('?'+updated.urlencode())

Мой settings.py

TEMPLATES = [
    {
        ...
        'OPTIONS': {
            ...
            # loads custom template tags
            'libraries': {
                'mytags': 'config.template_tags',
            }
        },
    },
]

Пример использования в шаблонах:

{% load mytags %}
<a href="{% add_query_params request page=2 %}">

Протестировано с Python3.6 в Django1.11.10

1 голос
/ 28 октября 2017

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

@register.simple_tag(takes_context=True)
def querystring(context, **kwargs):
    """
    Creates a URL (containing only the querystring [including "?"]) derived
    from the current URL's 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's a QueryDict not a dict
        updated[k] = v

    return '?{}'.format(updated.urlencode()) if updated else ''
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...