Užfiksuokite URL parametrus request.GET

Šiuo metu nustatau reguliarias išraiškas, kad užfiksuotų parametrus URL, kaip aprašyta pamokoje. Kaip pasiekti parametrus iš URL, kaip „ HttpRequest objekto dalį? Mano „ HttpRequest.GET šiuo metu grąžina tuščią „ QueryDict objektą.

Norėčiau žinoti, kaip tai padaryti be bibliotekos, kad geriau pažintumėte Django.

299
29 сент. sutee yra 29 sep . 2008-09-29 23:29 '08 at 11:29 2008-09-29 23:29
@ 8 atsakymai

Jei jūsų URL yra domain/search/?q=haha , turite naudoti request.GET.get('q', '') .

q yra norimas parametras ir '' yra numatytoji vertė, jei q nerasta.

Jei vietoj to tiesiog sukonfigūruosite URLconf , tada jūsų įrašai iš regex perduodami funkcijoms kaip argumentai (arba pavadinti argumentai).

Pavyzdžiui:

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

Tada savo views.py turėsite

 def profile_page(request, username): # Rest of the method 
457
29 сент. atsakymas suteiktas camflan 29 rugsėjis 2008-09-29 23:31 '08 at 23:31 pm 2008-09-29 23:31

Kad paaiškintumėte „camflan“ paaiškinimą, tarkime, jūs turite

  • url(regex=r'^user/(?P<username>\w{1,50})/$', view='views.profile_page') taisyklė url(regex=r'^user/(?P<username>\w{1,50})/$', view='views.profile_page')
  • a gaunamo užklausos http://domain/user/thaiyoshi/?message=Hi

URL tvarkyklės taisyklė "user/thaiyoshi/" URL kelio dalis (čia "user/thaiyoshi/" ) ir perduos jų naršymo funkcijas kartu su užklausos objektu.

Užklausos eilutė (čia message=Hi ) yra išanalizuota ir parametrai išsaugomi kaip QueryDict request.GET . Nėra atliekamas tolesnis HTTP GET parametrų kartografavimas ar apdorojimas.

Ši peržiūros funkcija naudoja abi dalis, gautas iš URL kelio ir užklausos parametro:

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

Kaip papildomą pastabą, prašymo metodas (šiuo atveju "GET" ir pateiktoms formoms paprastai yra "POST" ) pateikiamas prašymo metodu. Kai kuriais atvejais naudinga patikrinti, ar tai yra tikėtasi.

Atnaujinimas: priimant sprendimą, ar naudoti URL ar užklausos parametrus informacijos perdavimui, galite padėti:

  • naudokite URL, kad vienareikšmiškai nustatytumėte išteklius, pvz. /blog/post/15/ (ne /blog/posts/?id=15 )
  • pvz., naudokite užklausos parametrus, kad pakeistumėte šaltinio rodymo būdą. /blog/post/15/?show_comments=1 arba /blog/posts/2008/?sort_by=date>
  • padaryti žmoniškus URL, venkite, pavyzdžiui, naudoti identifikavimo numerius ir naudoti. datos, kategorijos ir (arba) kulkos: /blog/post/2008/09/30/django-urls/
258
01 окт. atsakymas pateikiamas akaihola 01 okt. 2008-10-01 15:11 '08 at 15:11 2008-10-01 15:11

Naudokite GET

 request.GET["id"] 

POST naudojimas

 request.POST["id"] 
33
21 янв. Atsakymą pateikė Dadaso Zanzane 21 sausis 2015-01-21 11:08 '15 - 11:08 2015-01-21 11:08
 def some_view(request, *args, **kwargs): if kwargs.get('q', None): # Do something here .. 
17
18 нояб. Atsakymą pateikė Kevinas lapkričio 18 d. 2010-11-18 21:40 '10, 21:40 2010-11-18 21:40

Norėčiau pasidalinti patarimu, kuris gali jums sutaupyti laiko.
Jei planuojate naudoti kažką panašaus į savo urls.py failą:

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

Kas iš esmės reiškia www.example.com/<username> . Būtinai įdėkite jį URL adresų pabaigoje, nes priešingu atveju jis yra prieštaringas su vėlesniais URL, t. Y. Prieiga prie vieno iš jų suteiks jums malonų klaidą User matching query does not exist.

Aš tai patyriau; Tikiuosi, kad tai padės!

12
05 февр. Atsakymą pateikė DrKaoliN 05 Feb. 2013-02-05 05:05 '13, 5:05, 2013-02-05 05:05

Tai nėra būtent tai, ko prašėte, tačiau šis fragmentas yra naudingas tvarkant query_strings templates .

8
30 сент. atsakymas duodamas įstrigęs 30 rugsėjo 2008-09-30 12:19 '08 12:19 val. 2008-09-30 12:19

Tais atvejais, kai turite tik request objektą, galite naudoti request.parser_context['kwargs']['your_param']

1
05 мая '17 в 16:54 2017-05-05 16:54 Atsakymas buvo pateiktas Ole Henrik Skogstrøm gegužės 17 d. 17 val

Turite du pagrindinius būdus, kaip tai padaryti, jei URL atrodo taip:

 https://domain/method/?a=x> 

v1:

Jei reikalingas konkretus raktas, galite naudoti:

 key_a = request.GET['a'] 

Tai grąžins a reikšmę, jei raktas yra, ir išimtis, jei ne.

v2:

Jei raktai yra neprivalomi:

 request.GET.get('a') 

Galite tai išbandyti be jokių argumentų, jis neveiks. Todėl galite jį suvynioti try: except: ir grąžinkite HttpResponseBadRequest() kaip pavyzdį. Tai paprastas būdas padaryti kodą mažiau sudėtingą, nenaudojant specialaus išimties tvarkymo.

0
04 окт. Atsakymas duotas Bartłomiej Pasek 04 okt. 2017-10-04 15:05 '17, 15:05 2017-10-04 15:05

Žr. Kitus klausimus apie žymes arba užduokite klausimą

"192.102.6.96 - 192.102.6.96"