2012-03-06 4 views
56

मैं django 1.2 का उपयोग कर रहा हूं और urlresolvers रिवर्स विधि का उपयोग कर एक दृश्य से दूसरे में जा रहा हूं।मैं django urlresolvers का उपयोग कर जीईटी पैरामीटर कैसे पास करूं

url = reverse(viewOne) 

और मैं एक बात पैरामीटर, उदाहरण के लिए

name = 'जो'

ताकि viewOne में पारित करने के लिए चाहते हैं, तो मुझे क्या

def viewOne(request): 
    request.GET['name'] 

मुझे

मिलेगा

मैं यह कैसे कर सकता हूं?

+4

पर [है कि इसका जवाब] एक नजर डालें (http://stackoverflow.com/a/5341769/301373) जो इस तरह की चीज करने का एक अच्छा तरीका देता है। – sberder

+1

मैंने एक सुविधा अनुरोध बनाया: https://code.djangoproject.com/ticket/25582 – guettli

उत्तर

103

प्राप्त पैरामीटर के पास URL के साथ कुछ भी नहीं है जैसा कि reverse द्वारा लौटाया गया है।

url = "%s?name=joe" % reverse(viewOne) 
+4

यह इस उदाहरण के लिए काम करता है। चूंकि कोई उद्धरण नहीं किया जाता है, इसलिए यह विफल रहता है यदि आप उन मानों का उपयोग करते हैं जिन्हें उद्धृत करने की आवश्यकता है। – guettli

57

एक सुरक्षित और अधिक लचीला तरीका:: बस उस पर अंत में जोड़ने

import urllib 
from django.core.urlresolvers import reverse 

def build_url(*args, **kwargs): 
    get = kwargs.pop('get', {}) 
    url = reverse(*args, **kwargs) 
    if get: 
     url += '?' + urllib.urlencode(get) 
    return url 

तो आप उपयोग कर सकते हैं build_url:

url = build_url('view-name', get={'name': 'joe'}) 

जो reverse रूप में एक ही तर्क लेता है, लेकिन एक अतिरिक्त कीवर्ड तर्क get प्रदान करता है जहां आप इसे GET पैरामीटर शब्दकोश में डाल सकते हैं।

+4

नोट: Django's 'django.utils.http.urlencode' फ़ंक्शन बेहतर हो सकता है क्योंकि यह" पायथन के urllib.urlencode() फ़ंक्शन का संस्करण है जो यूनिकोड स्ट्रिंग पर काम कर सकता है ": https://docs.djangoproject.com/en /1.10/ref/utils/#django.utils.http.urlencode –

13

यह अमीर के समाधान के समान है लेकिन सूचियों को भी संभालता है।

from django.core.urlresolvers import reverse 
from django.http import QueryDict 

def build_url(*args, **kwargs): 
    params = kwargs.pop('params', {}) 
    url = reverse(*args, **kwargs) 
    if not params: return url 

    qdict = QueryDict('', mutable=True) 
    for k, v in params.iteritems(): 
     if type(v) is list: qdict.setlist(k, v) 
     else: qdict[k] = v 

    return url + '?' + qdict.urlencode() 

उदाहरण उपयोग: इस पर देरी सुधार के लिए

>>> build_url('member-list', params={'format': 'html', 'sex': ['male', 'female']}) 
u'/members/?format=html&sex=male&sex=female' 
+0

'लिंग = पुरुष और लिंग = मादा' होने का क्या मतलब है? मुझे लगता है कि यह होना चाहिए और सेक्स [] = मादा और लिंग [] = मादा '(अतिरिक्त '[]') को नोट करें, जीईटी अनुरोध सरणी – potatoes

+1

@ पॉट्स '' [] '' एक PHP सम्मेलन है। –

-2

क्षमा करें।

जबकि दोनों यहाँ जवाब भी अच्छी तरह से आवश्यक कार्य संभालती है, मुझे लगता है urlencode को सिर्फ एक सरल समारोह एक शब्दकोश ऐसा करने का सबसे आसान तरीका है:

import urllib 

def getify(dic): 
    st = '' 
    for K, V in dic.items(): 
     K = urllib.parse.quote(str(K)) 
     if isinstance(V, list): 
      for v in V: 
       st += K + '=' + urllib.parse.quote(str(v)) + '&' 
     else: 
      st += K + '=' + urllib.parse.quote(str(V)) + '&' 
    return st.rstrip('&') 
+0

यह * * * शब्दकोश को urlencode नहीं करता है - URL आरक्षित वर्णों (जैसे '#', '?') या किसी भी प्रकार के प्रतिशत एन्कोडिंग का कोई प्रबंधन नहीं है: https://en.wikipedia.org/wiki/Percent-encoding – jamesc

संबंधित मुद्दे