Как перенаправить с параметром get в представлении Django? - PullRequest
0 голосов
/ 04 мая 2019

Я хочу перенаправить с параметром GET в представлении django. По некоторым причинам я хочу использовать параметр GET, а не параметр url.

def product_new(request):
    group = request.GET.get('group')
    if group == None:
        product = Product.objects.create()
        return redirect('cms:product_list_edit')
    else:
        product = Product.objects.create(group=group)
        rreturn redirect('cms:product_list_edit') # I want to redirect this url with GET parameter.

Ответы [ 3 ]

0 голосов
/ 04 мая 2019

Насколько мне известно, у Django нет инструментов для добавления строк запросов в URL, но это само по себе не является проблемой, поскольку мы можем создать свою собственную функцию, например:

from django.urls import reverse
from django.http.response import HttpResponseRedirect

def redirect_qd(viewname, *args, qd=None, **kwargs):
    rev = reverse(viewname, *args, **kwargs)
    if qd:
        rev = '{}?{}'.format(rev, qd.urlencode())
    return HttpResponseRedirect(rev)

Кодирование значений важно. Представьте, что ваш group имеет значение foo&bar=3. Если вы не закодируете это должным образом, то это означает, что ваша строка запроса будет позже проанализирована как два параметра: group и bar с group, равным foo и bar, являющимся 3. Таким образом, это не то, что вы хотели. Использование urlencode приведет к 'group=foo%26bar%3D3', что, таким образом, является предполагаемым значением.

и тогда мы можем использовать эту функцию как:

from django.http.request import QueryDict

def product_new(request):
    group = request.GET.get('group')
    if group == None:
        product = Product.objects.create()
        return redirect('cms:product_list_edit')
    else:
        product = Product.objects.create(group=group)
        qd = QueryDict(mutable=True)
        qd.update(group=group)
        return <b>redirect_qd('cms:product_list_edit', qd=qd)</b>

Если вы просто хотите передать всю строку запроса, вы можете вызвать ее с помощью redirect_qd('myview', request.GET).

0 голосов
/ 12 июня 2019

для python3 и выше:

def redirect_with_params(viewname, **kwargs):
    """
    Redirect a view with params
    """
    rev = reverse(viewname)

    params = urllib.parse.urlencode(kwargs)
    if params:
        rev = '{}?{}'.format(rev, params)

    return HttpResponseRedirect(rev)

использование:

redirect_with_params('main-domain:index', param1='value1', param2='value2')
0 голосов
/ 04 мая 2019

Я нашел ответ именно то, что хотел.

def product_new(request):
    group = request.GET.get('group')
    if group == None:
        product = Product.objects.create()
        return redirect('cms:product_list_edit')
    else:
        product = Product.objects.create(group=group)
        response = redirect('cms:product_list_edit')
        response['Location'] += '?group=' + group
        return response
...