python - шаблонные - кастомные теги django




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

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

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

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

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


Если вы зарегистрируете 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 %}">

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


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

Мой myproject / template_tags.py

from django import template


register = template.Library()


# https://.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())

Мои настройки.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


Сообщается другими ответами, но не требует 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 ''

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

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




django