अनुरोध में url पैरामीटर कैप्चर करना। GET


458

मैं वर्तमान में एक url में मापदंडों को पकड़ने के लिए नियमित अभिव्यक्तियों को परिभाषित कर रहा हूं, जैसा कि ट्यूटोरियल में वर्णित है। मैं HttpRequestऑब्जेक्ट के भाग के रूप में url से मापदंडों का उपयोग कैसे करूं ? मेरा HttpRequest.GETवर्तमान में एक खाली QueryDictवस्तु लौटाता है ।

मैं सीखना चाहता हूं कि बिना पुस्तकालय के यह कैसे करना है ताकि मैं Django को बेहतर तरीके से जान सकूं।

जवाबों:


663

जब url जैसा हो:domain/search/?q=haha तो, आप उपयोग करेंगे request.GET.get('q', '')

qवह पैरामीटर है जो आप चाहते हैं, और ''यदि qनहीं मिला तो डिफ़ॉल्ट मान है।

हालाँकि, यदि आप इसके बजाय केवल अपने विन्यास कर रहे हैंURLconf , तो आपके कैप्चर regexको फ़ंक्शन में तर्क (या नामित तर्क) के रूप में पारित किया जाता है।

जैसे कि:

(r'^user/(?P<username>\w{0,50})/$', views.profile_page,),

तब तुम्हारे में views.pyतुम होते

def profile_page(request, username):
    # Rest of the method

10
क्या 'परम =' एकमात्र तरीका है जो Django मापदंडों को पहचानता है? क्या HTTP.GET के साथ URLconf का उपयोग करने का कोई तरीका है? मैं / परम / 2 करना चाहूंगा।
सुती 29:08

3
अपने URLconf और regex कैप्चर के बारे में मेरी प्रतिक्रिया के दूसरे भाग की जाँच करें।
कपफैन

2
कोई दिक्कत नहीं है। request.GET का उपयोग करें। यदि आप GET का उपयोग करते हुए फॉर्म जमा करते हैं, तो अनुरोध का उपयोग करें। POST का उपयोग करते हुए यदि आप एक फॉर्म सबमिट करते हैं, और यदि आप URL को वेरिएबल सेक्शन के लिए कॉन्फ़िगर करना चाहते हैं, तो यह URLconf / view argument है।
21

10
वर्ग आधारित विचारों के बारे में क्या?
उपयोगकर्ता

8
कक्षा आधारित विचारों के लिए आप उपयोग कर सकते हैंself.kwargs['parameter']
रोएंडेल सिल्बी जूल

336

कैम्फ्लान के स्पष्टीकरण को स्पष्ट करने के लिए, मान लीजिए कि आपके पास है

  • नियम url(regex=r'^user/(?P<username>\w{1,50})/$', view='views.profile_page')
  • के लिए आने वाले अनुरोध में http://domain/user/thaiyoshi/?message=Hi

URL प्रेषण नियम URL पथ के भागों (यहां "user/thaiyoshi/") को पकड़ेगा और उन्हें अनुरोध ऑब्जेक्ट के साथ दृश्य फ़ंक्शन में पास करेगा।

क्वेरी स्ट्रिंग (यहाँ message=Hi) पार्स किया गया है और मानकों को एक के रूप में जमा हो जाती है QueryDictमें request.GET। HTTP GET के मापदंडों के लिए आगे कोई मिलान या प्रसंस्करण नहीं किया जाता है।

यह दृश्य फ़ंक्शन URL पथ से निकाले गए दोनों भागों और एक क्वेरी पैरामीटर का उपयोग करेगा:

def profile_page(request, username=None):
    user = User.objects.get(username=username)
    message = request.GET.get('message')

एक साइड नोट के रूप में, आपको अनुरोध विधि (इस मामले में "GET", और आमतौर पर सबमिट किए गए फ़ॉर्म के लिए "POST") मिलेगी request.method। कुछ मामलों में यह जाँचना उपयोगी है कि यह आपकी अपेक्षा के अनुरूप है।

अद्यतन: जब यह तय करने के लिए कि URL पथ या क्वेरी पैरामीटर का उपयोग करना है या नहीं, तो निम्नलिखित में मदद मिल सकती है:

  • विशिष्ट पहचान वाले संसाधनों के लिए URL पथ का उपयोग करें, जैसे /blog/post/15/(नहीं /blog/posts/?id=15)
  • संसाधन प्रदर्शित करने के तरीके को बदलने के लिए क्वेरी पैरामीटर का उपयोग करें, जैसे /blog/post/15/?show_comments=1या/blog/posts/2008/?sort_by=date&direction=desc
  • मानव के अनुकूल URL बनाने के लिए, ID नंबरों का उपयोग करने से बचें और उदाहरण के लिए दिनांक, श्रेणियां और / या स्लग का उपयोग करें: /blog/post/2008/09/30/django-urls/

17
यह वास्तव में अच्छी तरह से लिखित उत्तर है। मुझे यकीन है कि इससे मुझे Django को थोड़ा बेहतर समझने में मदद मिली।
मार्क

2
नाम के उल्लेख के बिना हम सभी मापदंडों को कैसे प्राप्त कर सकते हैं
अंक 10:

@numerah request.GET एक पायथन डिक्शनरी है। आप अनुरोध के माध्यम से इसे टाइप कर सकते हैं। GET.items ()।
एकाइहॉला

सही जवाब।
जय गीथ

1
किसी भी कारण से इसे अपडेट में लिखी गई आदतों का पालन करना पसंद है? (कब URL पथ बनाम GET params का उपयोग करें)
m0etaz

55

GET का उपयोग करना

request.GET["id"]

POST का उपयोग करना

request.POST["id"]

27
हालांकि यह मौजूदा कुंजियों के लिए काम करता है, कैंफ्लान और अकाईहॉला के जवाबों ने KeyErrorगायब कुंजी के मामले में अपवादों से बचने के लिए .get () का उपयोग किया है । ऐसा करना बुद्धिमानी होगी (उदाहरण के लिए request.POST.get('id', ''))।
विविलासुपरोइरमैन



20

मैं अपने यहाँ कुछ विकल्प जोड़ना चाहता हूँ। किसी को आश्चर्य होगा कि urls.py में रास्ता कैसे तय किया जाए, जैसे कि

domain/search/?q=CA

ताकि हम क्वेरी आमंत्रित कर सकें।

तथ्य यह है कि urls.py में ऐसा मार्ग निर्धारित करना आवश्यक नहीं है। आपको जो सेट करने की आवश्यकता है वह केवल urls.py में मार्ग है

urlpatterns = [
    path('domain/search/', views.CityListView.as_view()),
]

और जब आप http: // servername: port / domain / search /? q = CA इनपुट करते हैं । क्वेरी भाग '? Q = CA' स्वचालित रूप से हैश तालिका में आरक्षित होगा जिसे आप संदर्भ में दे सकते हैं

request.GET.get('q', None).

यहाँ एक उदाहरण है (view.py)

class CityListView(generics.ListAPIView):
    serializer_class = CityNameSerializer

    def get_queryset(self):
        if self.request.method == 'GET':
            queryset = City.objects.all()
            state_name = self.request.GET.get('q', None)
            if state_name is not None:
                queryset = queryset.filter(state__name=state_name)
            return queryset

इसके अलावा, जब आप Url में क्वेरी स्ट्रिंग लिखते हैं

http://servername:port/domain/search/?q=CA

उद्धरण स्ट्रिंग जैसे उद्धरण में न लपेटें

http://servername:port/domain/search/?q="CA"

हाय एरिक! मैं Django के लिए नया हूँ। क्या आप "queryset = queryset.filter (state__name = state_name)" पर अधिक प्रकाश डाल सकते हैं। राज्य__नाम में डबल अंडरस्कोर क्या दर्शाता है।
सुब्बू

1
यहाँ "राज्य" एक तालिका है और "नाम" इस तालिका में दर्ज है। Django के फ़िल्टर में, state__name फ़ील्ड का नाम "नाम" "राज्य" तालिका में संदर्भित करेगा।
एरिक एंड्रयूज

यह एक दूसरों की तुलना में काम करता है।
सिबिश

17

मैं एक टिप साझा करना चाहता हूं जो आपको कुछ समय बचा सकता है।
यदि आप अपनी urls.pyफ़ाइल में ऐसा कुछ उपयोग करने की योजना बनाते हैं :

url(r'^(?P<username>\w+)/$', views.profile_page,),

जिसका मूल अर्थ है www.example.com/<username>। इसे अपनी URL प्रविष्टियों के अंत में रखना सुनिश्चित करें, क्योंकि अन्यथा, URL प्रविष्टियों के साथ टकराव का कारण बनने का खतरा है, जो नीचे का पालन करते हैं, अर्थात उनमें से किसी एक को एक्सेस करने से आपको अच्छी त्रुटि मिलेगी: User matching query does not exist.

मैंने इसे स्वयं अनुभव किया है; आशा है ये मदद करेगा!


2
साथ ही, इस मामले में आप यह जांचना चाहते हैं कि उपयोगकर्ता नाम अन्य url enrties से नहीं टकराते।
DrKaoliN

13

आपके पास ऐसा करने के दो सामान्य तरीके हैं, यदि आपका url ऐसा दिखता है:

https://domain/method/?a=x&b=y

v1:

यदि विशिष्ट कुंजी अनिवार्य है तो आप उपयोग कर सकते हैं:

key_a = request.GET['a']

aयदि कुंजी मौजूद है और अपवाद नहीं है तो यह मान लौटाएगा ।

वी 2:

यदि आपकी चाबियाँ वैकल्पिक हैं:

request.GET.get('a')

आप कोशिश कर सकते हैं कि बिना किसी तर्क के यह दुर्घटनाग्रस्त न हो। तो आप इसे लपेट सकते हैं try: except:और HttpResponseBadRequest()उदाहरण में लौट सकते हैं । विशेष अपवाद हैंडलिंग के बिना, अपने कोड को कम जटिल बनाने का यह एक सरल तरीका है।


मैं टेम्पलेट से क्वेरी परम का पता कैसे लगा सकता हूं?
अकिन ह्वान


5

ये प्रश्न वर्तमान में दो तरह से किए जाते हैं। यदि आप क्वेरी पैरामीटर (GET) तक पहुँचना चाहते हैं, तो आप निम्नलिखित प्रश्न कर सकते हैं:

http://myserver:port/resource/?status=1
request.query_params.get('status', None) => 1

यदि आप POST द्वारा पारित मापदंडों का उपयोग करना चाहते हैं, तो आपको इस तरह से पहुंचने की आवश्यकता है:

request.data.get('role', None)

'Get ()' के साथ डिक्शनरी (QueryDict) तक पहुँच कर, आप एक डिफ़ॉल्ट मान सेट कर सकते हैं। उपरोक्त मामलों में, यदि 'स्थिति' या 'भूमिका' को सूचित नहीं किया जाता है, तो मूल्य कोई भी नहीं हैं।


0

यह एक और वैकल्पिक समाधान है जिसे लागू किया जा सकता है:

यूआरएल विन्यास में। :

urlpatterns = [path('runreport/<str:queryparams>', views.get)]

विचारों में:

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