मैं django urlresolvers रिवर्स का उपयोग करके GET पैरामीटर कैसे पास कर सकता हूं


81

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

url = reverse(viewOne)

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

नाम = 'जो'

दृश्य में ऐसा है कि अगर मैं करता हूँ

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

मुझे मिलेगा

joe

मैं उसको कैसे करू ?


4
उस उत्तर पर एक नज़र डालें जो इस तरह का काम करने के लिए एक अच्छा तरीका देता है।
3

1
मैंने एक फीचर अनुरोध बनाया: code.djangoproject.com/ticket/25582
guettli

जवाबों:


150

GET मापदंडों का URL से कोई लेना-देना नहीं है जैसा कि लौटा है reverse। बस इसे अंत में जोड़ें:

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

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

75

एक सुरक्षित और अधिक लचीला तरीका:

import urllib
from django.urls 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पैरामीटर को एक शब्दकोश के रूप में रख सकते हैं ।


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

18

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

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'

होने का क्या मतलब है sex=male&sex=female? मुझे लगता है कि यह होना चाहिए &sex[]=female&sex[]=female(अतिरिक्त पर ध्यान दें []), एक GET अनुरोध सरणी होने के लिए
प्रेरित करें

3
@ पोटेटो []एक 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('&')

1
यह करता है नहीं शब्दकोश urlencode - वहाँ यूआरएल का कोई हैंडलिंग है सुरक्षित वर्णों (जैसे #, ?) या प्रतिशत एन्कोडिंग के किसी भी प्रकार: en.wikipedia.org/wiki/Percent-encoding
jamesc
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.