2011-02-14 10 views
30

मैं एक नामित यूआरएल को उलटाने की कोशिश कर रहा हूं और इसमें एक क्वेरीस्ट्रिंग शामिल कर रहा हूं। असल में, मैंने लॉगिन फ़ंक्शन को संशोधित किया है, और मैं इसमें ?next= भेजना चाहता हूं।एक django.core.urlresolvers रिवर्स() कॉल में क्वेरीस्ट्रिंग सहित

यहाँ अब मैं क्या कर रहा है: reverse(name) + "?next=" + reverse(redirect)

यहाँ मैं क्या करना चाहते हैं: reverse(name, kwargs = { 'next':reverse(redirect) })

प्रवेश पृष्ठ (सिर्फ एक उदाहरण के रूप में) के लिए मेरे URL ऐसा दिखाई देगा:

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

तो मैं इसे पूरी तरह से शामिल करने के बिना अगली चीज़ को कैसे शामिल कर सकता हूं (या इसे कॉल करें)? यह सबसे अच्छा एक iffy समाधान की तरह लगता है।

उत्तर

32

आप यूआरएल confs में जीईटी पैरामीटर कैप्चर नहीं कर सकते हैं, इसलिए आपकी विधि सही है।

मैं आम तौर पर स्ट्रिंग स्वरूपण पसंद करता हूं लेकिन यह वही बात है।
"%s?next=%s" % (reverse(name), reverse(redirect))

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

URLconf, अनुरोध किया गया URL के खिलाफ खोज एक सामान्य अजगर स्ट्रिंग के रूप में। इसमें GET या पोस्ट पैरामीटर, या डोमेन नाम शामिल नहीं है।

7

मुझे लगता है कि इस एपीआई को बेनकाब करने के लिए Django की रिवर्स विधि को लपेटना बेहतर है।

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.core.urlresolvers.reverse का आयात सिर्फ myproject.myutils.urlresolvers.reverse आयात के बजाय Django पर निर्भर करता है, तो में इस कोड डालें: यहाँ कुछ सरल कोड यह करने के लिए है

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 
20

मैं सिर्फ सवाल में पूछा एक की तरह अपने ही उपयोगिता समारोह बना दिया। जाहिर है, आपका समाधान बिल्कुल खराब नहीं है। टिकट चर्चा के अनुसार 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)}) 
4

मैं एक ही सवाल के साथ परेशान था और इस link पाया:

1

इस्तेमाल किया जा सकता क्वेरी वैकल्पिक रखने के लिए, आप अपने खुद के समारोह के साथ Django के रिवर्स समारोह लपेट कर सकते हैं कि रिवर्स फ़ंक्शन के अन्य उचित हैंडलिंग की अनुमति देने के लिए क्वेरी को भी संभालता है।

एक उचित अनुरोध बना रहा है - ध्यान दें कि query_kwargs वैकल्पिक है, तो आप इसके लिए

# from a views in views.py 
def sendingView(request, truckID, fleetSlug): 
    #in the GET or POST 
    return HttpResponseRedirect(reverse('subAppName:urlViewName', 
             kwargs={'anyPassedKawrgs':goHere,…}, 
             query_kwargs={'queries': goHere} 
            )) 

# from a template in specificTemplate.html 
<a class="nav-link" href="{% url 'subAppName:urlViewName' kwarg1=kwarg1 kwarg2=kwarg2 … query_kwargs={'dict':here} %}">Link</a> 

#from a model in models.py 
class Truck(models.Model): 
    name = models.CharField(…) 
    def get_absolute_wi_url(self): 
    return reverse('subAppName:urlViewName', kwargs={'kwarg1':kwarg1,'kwarg2':kwarg2}) 

भेजने के लिए utils.py फ़ाइल (docs के आधार पर) में नहीं है (1.11 और ऊपर?)

-myMainApp 
    -apps 
    -static 
    ... 
    -utils 
    -__init__.py 
    -utils.py 

from django.core.urlresolvers import reverse as django_reverse 

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

यूआरएल में conf urls.py

app_name = 'subAppName' 
urlpatterns = [ 
    url(r'^(?P<kawrg1>[a-zA-Z0-9]+)/(?P<kawrg2>[a-zA-Z0-9]+)/path/to/here/$', views.urlViewFunctionName, name='urlViewName'), 

और क्वेरी

#in a view 
def urlViewFunctionName(request, kwarg1, kwarg2): 
    if request.GET.get('submittedData'): 
    submittedQuery = request.GET.get('submittedData') 
else: 
    submittedQuery = None 
return render(request, 'trucks/weeklyInspectionSuccess.html', { 
    'truck': truck, 
    'submittedQuery': submittedQuery 
}) 

#in a template 
<div class="container"> 
    Success for {{kwarg1}} 
    {{submittedQuery}} 
</div> 
तक पहुंच प्राप्त करना
संबंधित मुद्दे