Я только начинающий с Джанго, так что вам придется принять мой ответ крупицей соли.
Во-первых, 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/). Это потому, что фильтр не добавляет его. Но вы можете изменить это, чтобы сделать это.
Я оставлю это вам на зарегистрировать этот шаблон фильтра . Подробнее здесь . Надеюсь, это поможет.