Подтвердить что ты не робот

Включая запрос в вызове django.core.urlresolvers reverse()

Я пытаюсь изменить именованный URL-адрес и включить в него строку запроса. В принципе, я изменил функцию входа, и я хочу отправить ?next= в нее.

Вот что я делаю сейчас: reverse(name) + "?next=" + reverse(redirect)

Вот что я хотел бы сделать: reverse(name, kwargs = { 'next':reverse(redirect) } )

Мой URL-адрес для страницы входа (как пример) выглядит следующим образом:

url(r'^login/', custom_login, name = 'login'),

Итак, как мне изменить все это (или вызвать его), чтобы включить следующий, не связав его? В лучшем случае это похоже на решение iffy.

4b9b3361

Ответ 1

Вы не можете фиксировать параметры GET в URL-адресах, поэтому ваш метод верен.

Я обычно предпочитаю форматирование строк, но это то же самое.
"%s?next=%s" % (reverse(name), reverse(redirect))

http://docs.djangoproject.com/en/dev/topics/http/urls/#what-the-urlconf-searches-against

URLconf ищет против запрошенный URL, как обычный Python строка. Это не включает GET или POST или доменное имя.

Ответ 2

Я только что сделал свою собственную функцию полезности, как тот, который задан в вопросе:

from django.utils.http import urlencode

def my_reverse(viewname, kwargs=None, query_kwargs=None):
    """
    Custom reverse to add a query string after the url
    Example usage:
    url = my_reverse('my_test_url', kwargs={'pk': object.id}, query_kwargs={'next': reverse('home')})
    """
    url = reverse(viewname, kwargs=kwargs)

    if query_kwargs:
        return u'%s?%s' % (url, urlencode(query_kwargs))

    return url

Ответ 3

Я думаю, что лучше обработать обратный метод Django, чтобы разоблачить этот API. Вот несколько простых кодов для этого:

from django.core.urlresolvers import reverse as django_reverse

def reverse(viewname, urlconf=None, args=None, kwargs=None, prefix=None, current_app=None):
    """
    Wrapper of django.core.urlresolvers.reverse that attaches arguments in kwargs as query string parameters
    """
    if kwargs:
        return '%s?%s' % (django_reverse(viewname, urlconf, args, None, prefix, current_app), \
                        '&'.join(['%s=%s' % (k,v) for k,v in kwargs.items()]))
    else:
        return django_reverse(viewname, urlconf, args, kwargs, prefix, current_app)

Поместите этот код в какую-нибудь утилиту или обычное приложение, которое зависит только от Django, а вместо импорта django.core.urlresolvers.reverse просто импортируйте myproject.myutils.urlresolvers.reverse

Ответ 4

Я был обеспокоен тем же вопросом и нашел ссылку . Видимо, ваше решение неплохо сконструировано. Согласно обсуждению билета, Django не будет предоставлять эту функциональность.

Вы можете использовать urlobject или furl.

Другим способом является использование вашей собственной функции, чтобы сделать это гораздо более чистым способом. Здесь тот, который указан в обсуждении

from django.utils.http import urlencode
from django.core.urlresolvers import reverse as original_reverse

def reverse(*args, **kwargs):
    get = kwargs.pop('get', {})
    url = original_reverse(*args, **kwargs)

    if get:
        url += '?' + urlencode(get)

    return url

В этом вопросе его можно использовать следующим образом

from [myfunctions] import reverse
...
reverse('login', get={next: reverse(redirect)})