добавить переменную request.GET, используя django.shortcuts.redirect

Можно ли добавить переменные GET в перенаправление? (Без необходимости изменять мой urls.py)

If I do redirect('url-name', x)

я получаю HttpResponseRedirect('/my_long_url/%s/', x)

У меня нет жалоб на использование HttpResponseRedirect('/my_long_url/%s/?q=something', x) вместо этого, но просто интересно...


person juanefren    schedule 22.09.2010    source источник
comment
Небольшая опечатка в ответе Маноджа Говиндана: params = urllib.urlencode(**kwargs) необходимо заменить на params = urllib.urlencode(kwargs). В противном случае вы получите TypeError: urlencode() получил неожиданный аргумент ключевого слова   -  person Max Arnold    schedule 13.06.2011


Ответы (4)


Можно ли добавить переменные GET в перенаправление? (Без необходимости изменять мой urls.py)

Я не знаю способа сделать это без изменения файла urls.py.

У меня нет жалоб на использование HttpResponseRedirect('/my_long_url/%s/?q=something', x) вместо этого, но просто интересно...

Возможно, вы захотите написать тонкую оболочку, чтобы упростить эту задачу. Скажи, custom_redirect

def custom_redirect(url_name, *args, **kwargs):
    from django.core.urlresolvers import reverse 
    import urllib
    url = reverse(url_name, args = args)
    params = urllib.urlencode(kwargs)
    return HttpResponseRedirect(url + "?%s" % params)

Затем это можно вызвать из ваших представлений. Например,

return custom_redirect('url-name', x, q = 'something')
# Should redirect to '/my_long_url/x/?q=something'
person Manoj Govindan    schedule 22.09.2010
comment
Это безумие, это не часть фреймворка Django... Какая-то философская причина? - person Alex Gidan; 13.04.2017

Поскольку перенаправление просто возвращает объект HttpResponseRedirect, вы можете просто изменить это:

response = redirect('url-name', x)
response['Location'] += '?your=querystring'
return response
person SmileyChris    schedule 22.09.2010
comment
Достаточно просто использовать urldefrag, если это возможно. Спасибо за указание на потенциальную ошибку, если у вас есть якорь в ответе URL. - person SmileyChris; 02.12.2016
comment
Лучший ответ когда-либо - person Ronaldo Bahia; 13.04.2017
comment
@Колюня: Ты уверен? Я использую его с якорем - person Hassan Baig; 20.05.2019

Мы можем импортировать urlencode из django.

from django.utils.http import urlencode

get_args_str = urlencode({'q': 'something'})

Или мы можем просто использовать неразобранную строку параметров получения из начального запроса.

get_args_str = request.META['QUERY_STRING']

HttpResponseRedirect('%s?%s' % (url, get_args_str))
person Valery Ramusik    schedule 04.07.2018
comment
Я думаю, что x следует удалить, чтобы это заработало. В противном случае содержимое x добавляется как тело в ответ HTTP, хотя оно должно быть пустым. - person Tim Tisdall; 18.04.2019
comment
Да. Спасибо, что нашли эту ошибку. Отредактировано. - person Valery Ramusik; 18.04.2019

Я думаю, стоит отметить, что класс Django RedirectView имеет встроенный атрибут класса query_string, который можно переопределить или передать в as_view. Если установлено значение True, query_string сохранит строку запроса в перенаправлении. Например, в urls.py можно поместить следующее:

path('example-redirect/',
     RedirectView.as_view(url='https://example.com', query_string=True),
     name='example_redirect')
person Alex    schedule 12.07.2019