Django में एक ही पैरामीटर के लिए कई चर के साथ अनुरोध को कैसे संभालें


82

एक Django दृश्य में आप का उपयोग कर सकते हैं request.GET['variablename'], इसलिए आपके विचार में आप कुछ इस तरह से कर सकते हैं:

myvar = request.GET['myvar']

वास्तविक request.GET['myvar']वस्तु प्रकार है:

<class 'django.http.QueryDict'>

अब, यदि आप एक ही पैरामीटर नाम के साथ कई चर पास करना चाहते हैं, अर्थात:

http://example.com/blah/?myvar=123&myvar=567

आप listपैरामीटर के लिए एक अजगर लौटना चाहते हैं myvar, तो कुछ इस तरह से करें:

for var in request.GET['myvar']:
    print(var)

हालाँकि, जब आप यह कोशिश करते हैं कि आपको केवल अंतिम मान url में मिलता है अर्थात ऊपर दिए गए उदाहरण में आपको 567 मिलेगा , और शेल में परिणाम होगा:

5
6
7

हालाँकि, जब आप इसका एक प्रिंट करते हैं तो request.GETऐसा लगता है कि इसका कोई listअर्थ है:

<QueryDict: {u'myvar': [u'123', u'567']}>

ओके अपडेट: यह अंतिम मूल्य वापस करने के लिए डिज़ाइन किया गया है, मेरा उपयोग मामला है मुझे एक सूची की आवश्यकता है।

django डॉक्स से:

QueryDict। getitem (कुंजी) दिए गए कुंजी के लिए मान लौटाता है। यदि कुंजी का एक से अधिक मान है, तो getitem () अंतिम मान लौटाता है। यदि django.utils.datastructures.MultiValueDictKeyError उठाता है, तो कुंजी मौजूद नहीं है। (यह पायथन के मानक KeyError का एक उपवर्ग है, इसलिए आप KeyError को पकड़ने के लिए चिपक सकते हैं

QueryDict.getlist (कुंजी) पायथन सूची के रूप में अनुरोधित कुंजी के साथ डेटा लौटाता है। यदि कोई कुंजी मौजूद नहीं है, तो एक खाली सूची देता है। यह किसी प्रकार की सूची वापस करने की गारंटी है।

अद्यतन: अगर किसी को पता है कि डेजैंगो देव ने ऐसा क्यों किया है तो कृपया मुझे बताएं, लगता है कि एक सूची दिखाने के लिए काउंटर-सहज ज्ञान युक्त है और यह एक जैसा व्यवहार नहीं करता है। बहुत अजगर नहीं है!


4
मुझे लगता है कि तर्क यह है कि आपको पता होना चाहिए कि क्या सूची या व्यक्तिगत मूल्य की अपेक्षा करनी चाहिए। QueryDict.getitem को किसी सूची को कभी-कभी, एक व्यक्तिगत आइटम को अन्य समय में वापस नहीं करना चाहिए - फिर सभी को इसे ठीक से संभालने के लिए हमेशा अपने रिटर्न प्रकार की जांच करनी होगी।
jgiles

जवाबों:


181

आप GET ऑब्जेक्ट की गेटलिस्ट () फ़ंक्शन चाहते हैं :

request.GET.getlist('myvar')

10
यदि आप आइटम वापस पोस्ट करने के लिए jquery का उपयोग कर रहे हैं, तो आपको var नाम के अंत में "[]" जोड़ने की आवश्यकता हो सकती है।
डैनी स्टैपल

2
मुझे गेटलिस्ट के बारे में पता था लेकिन "[]" ने मुझे फेंक दिया। इसके अलावा, मेरे पास एंडी स्टेपल नाम का एक दोस्त है, और एक दूसरे के लिए मैंने सोचा कि वह जानता था कि मुझे जोंगो के बारे में अधिक एहसास हुआ था। उसने मुझे भी फेंक दिया।
कुंगफू

1
इसे सभी Django डॉक्स, Django रेस्ट फ्रेमवर्क डॉक्स और मेरे माथे पर पीछे की ओर पोस्ट करने की आवश्यकता है। यह वास्तव में मुझे गार्ड से पकड़ा
एंथोनी मैनिंग-फ्रैंकलिन

ऐसा लगता है कि Django तरह की गेंद को उस पर गिरा दिया, यकीन नहीं तो इरादा नहीं
NaturalBornCamper

1

एक अन्य समाधान अनुरोध ऑब्जेक्ट की एक प्रति बना रहा है ... आम तौर पर, आप अनुरोध के माध्यम से पुनरावृत्ति नहीं कर सकते। GET या अनुरोध .POST ऑब्जेक्ट, लेकिन आप कॉपी पर इस तरह के संचालन कर सकते हैं:

res_set = request.GET.copy()
for item in res_set['myvar']:
    item
...

2
क्या आपको यकीन है? यह मेरे लिए बिल्कुल भी QueryDict के व्यवहार को नहीं बदलता है। मैं बस एक ही "सीमा" के साथ एक और QueryDict मिल
पागल

0

QueryDict ऑब्जेक्ट से एक क्वेरी स्ट्रिंग बनाते समय जिसमें एक ही पैरामीटर के लिए कई मान होते हैं (जैसे कि चेकबॉक्स का एक सेट) urlencode () विधि का उपयोग करें:

उदाहरण के लिए, मुझे आने वाले क्वेरी अनुरोध को प्राप्त करने, एक पैरामीटर को हटाने और अपडेट किए गए क्वेरी स्ट्रिंग को परिणामी पृष्ठ पर वापस लाने की आवश्यकता थी।

# Obtain a mutable copy of the original string
original_query = request.GET.copy()

# remove an undesired parameter
if 'page' in original_query:
    del original_query['page']

अब अगर मूल क्वेरी में इस तरह के एक ही पैरामीटर के लिए कई मान हैं: {... 'track_id': ['1', '2'], ...} कोड का उपयोग करते समय आप क्वेरी स्ट्रिंग में पहला तत्व खो देंगे। पसंद:

new_query = urllib.parse.urlencode(original_query)

का परिणाम...

...&track_id=2&...

हालाँकि, एक क्वेरी विधि के urlencode विधि का उपयोग कर सकता है ताकि कई मानों को ठीक से शामिल किया जा सके:

new_query = original_query.urlencode()

जो उत्पादन ...

...&track_id=1&track_id=2&...
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.