Ссылка на текущую страницу в Django, с дополнительными GET-параметрами? - PullRequest
6 голосов
/ 20 июня 2011

Как разместить ссылку HTML, которая ссылается на текущую страницу, и , которая добавляет дополнительные GET-параметры (или перезаписывает существующие, если они уже есть)существовать)?

Сейчас у меня есть что-то вроде:

 <a href="{{ request.path }}?Key=Value"> My Link </a>

В настоящее время request передается на страницу.Если request.path равно https://stackoverflow.com/,, тогда полученная ссылка становится https://stackoverflow.com/?Key=Value

Проблема?

Но, конечно, если текущий URL равен https://stackoverflow.com/?PrevKey=PrevValue, тогдаоно становится:

https://stackoverflow.com/?PrevKey=PrevValue?Key=Value

Обратите внимание на неправильный второй знак вопроса - на самом деле оно должно быть:

https://stackoverflow.com/?PrevKey=PrevValue&Key=Value

Кроме того, если есть уже ключ с тем же именем, то вместо того, чтобы перезаписать его, мое текущее решение игнорирует его - что неправильно.

Как мне решить эти две проблемы?

Ответы [ 4 ]

4 голосов
/ 20 июня 2011

Вам понадобится пользовательский тег. На djangosnippets есть пара - этот выглядит довольно всеобъемлющим.

1 голос
/ 05 мая 2013

Для тех, кто видит это в будущем: https://bitbucket.org/monwara/django-url-tools

0 голосов
/ 20 июня 2011

Я только начинающий с Джанго, так что вам придется принять мой ответ крупицей соли.

Во-первых, request.path должен возвращать путь к странице без домена, согласно документации . Таким образом, если запрос для http://example.com/, request.path должен быть просто "/". Поправьте меня если я ошибаюсь.

Но это не актуально. Что еще более важно, request.path не будет иметь никаких параметров запроса, поэтому, если запрашиваемая страница будет http://example.com/?PrevKey=PrevValue,, тогда request.path все равно будет "/". Если вы хотите получить параметры запроса, вы должны использовать словарный доступ к свойствам GET и POST (в данном случае GET) объекта request. А еще лучше, получить к ним доступ с помощью QueryDict методов .

То, что я хотел бы сделать здесь, и это ни в коем случае не лучший метод и код, это подготовить специальный фильтр шаблона, в котором вы передаете текущий объект запроса и пару ключ-значение для проверки.

Вот так будет выглядеть код вашего шаблона. Обратите внимание, что вы все еще можете жестко кодировать пару ключ-значение, хотя здесь она отформатирована как строка со значением ключевого двоеточия. Функция фильтра может обрабатывать (если вам нужно) более одного набора пар ключ-значение.

<a href="{{ request | addQueryParameter:'Key:Value'}}">My Link</a>

Функция фильтра:

from urllib import urlencode

def addQueryParameter(request, parameter):
    # parse the key-value pair(s) in parameter (which looks like a JSON string)
    # then add to dictionary d
    # note i am not taking into account white-space.
    for param in string.split(','):
        key, value = param.split(':', 1)
        d[key] = value

    # check if any keys in d are already in the request query parameters
    # if so, delete from d. If I misunderstood your question, then refactor 
    # to delete from request.GET instead:
    for key in d.keys():
        if key in request.GET.keys():
             del d[key]

    # add the keys in request.GET into d:
    d.extend(request.GET.items())

    # convert dictionary of key value pairs into a query string for urls, 
    # prepend a ?
    queryString = "?%s" % urlencode(d)
    return "%s%s" % (request.path, queryString if queryString else "")

Я должен указать, что если запрос для страницы http://example.com/login/?prev=news и ваш шаблон выглядит как

<a href="{{ request | addQueryParameter:'goto:dashboard,feature:products'}}">My Link</a>

Тогда вывод будет (надеюсь, если он будет работать):

<a href="/login/?prev=news&goto=dashboard&feature=products">
My Link</a>
<!-- the order of the above parameters may differ -->

Обратите внимание, что в этой ссылке нет домена (т.е. части http://example.com/). Это потому, что фильтр не добавляет его. Но вы можете изменить это, чтобы сделать это.

Я оставлю это вам на зарегистрировать этот шаблон фильтра . Подробнее здесь . Надеюсь, это поможет.

0 голосов
/ 20 июня 2011

Вы можете использовать: {{request.get_full_path}} для получения текущего пути с дополнительными параметрами.

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