67

名前付き URL を逆にしてクエリ文字列を含めようとしています。基本的にはログイン機能を改造して送り込みたい?next=

これが私が今していることです:reverse(name) + "?next=" + reverse(redirect)

これが私がやりたいことです:reverse(name, kwargs = { 'next':reverse(redirect) } )

ログインページの URL (例として) は次のようになります。

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

では、この全体を変更 (または呼び出し) して、連結せずに次のものを含めるにはどうすればよいでしょうか? せいぜいあいまいな解決策のように感じます。

4

5 に答える 5

62

URL conf で GET パラメータをキャプチャできないため、メソッドは正しいです。

私は通常、文字列の書式設定を好みますが、それは同じことです。
"%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 パラメーター、またはドメイン名は含まれません。

于 2011-02-14T17:50:15.843 に答える
34

質問で尋ねられたような独自のユーティリティ関数を作成しました。

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 f'{url}?{urlencode(query_kwargs)}'

    return url
于 2013-03-13T15:17:08.357 に答える
8

このAPIを公開するには、Djangoのreverseメソッドをラップする方が良いと思います。これを行うための簡単なコードを次に示します。

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をインポートします。

于 2012-08-28T23:03:57.297 に答える
8

私は同じ質問に悩まされ、このリンクを見つけました。どうやら、あなたのソリューションはまったく悪く設計されていません。チケットの議論によると、Django はこの機能を提供しません。

urlobjectまたはfurlを使用できます。

もう 1 つの方法は、はるかにクリーンな方法で、独自の関数を使用してこれを行うことです。これが議論で述べられたものです

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)})
于 2016-02-03T22:59:11.360 に答える