not Inclusion d'une chaîne de requête dans un appel django.core.urlresolvers reverse()




import django core urlresolvers (4)

Je viens de créer ma propre fonction d’utilité, semblable à celle posée dans la question:

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

J'essaie d'inverser une URL nommée et d'y inclure une chaîne de requête. En gros, j'ai modifié la fonction de connexion et je veux envoyer ?next= .

Voici ce que je fais maintenant: reverse(name) + "?next=" + reverse(redirect)

Voici ce que j'aimerais faire: reverse(name, kwargs = { 'next':reverse(redirect) } )

Mon URL pour la page de connexion (à titre d'exemple) ressemble à ceci:

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

Alors, comment puis-je modifier tout cela (ou l'appeler) pour inclure le suivant sans avoir à le concaténer? C'est au mieux une solution douteuse.


Vous ne pouvez pas capturer les paramètres GET dans l'URL confs, votre méthode est donc correcte.

Je préfère généralement le formatage des chaînes mais c'est la même chose.
"%s?next=%s" % (reverse(name), reverse(redirect))

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

URLconf recherche l'URL demandée sous forme de chaîne Python normale. Cela n'inclut pas les paramètres GET ou POST, ni le nom de domaine.


Je pense qu'il vaut mieux envelopper la méthode inverse de Django pour exposer cette API. Voici un code simple pour le faire:

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)

Mettez ce code dans un utilitaire ou une application courante qui ne dépend que de Django. Au lieu d'importer django.core.urlresolvers.reverse, importez simplement myproject.myutils.urlresolvers.reverse.


J'étais préoccupé par la même question et j'ai trouvé ce link . Apparemment, votre solution n'est pas mal conçue du tout. Selon la discussion sur le ticket, Django ne fournira pas cette fonctionnalité.

Vous pouvez utiliser urlobject ou furl .

L'autre façon, consiste à utiliser votre propre fonction pour le faire, d'une manière beaucoup plus propre. Voici celui indiqué dans la discussion

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

Dans le cas de la question, il peut être utilisé de la manière suivante

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




urlconf