request.GETでのURLパラメータのキャプチャ


458

チュートリアルで説明されているように、URLでパラメーターをキャプチャするために、現在正規表現を定義しています。HttpRequestオブジェクトの一部としてURLからパラメーターにアクセスするにはどうすればよいですか?私はHttpRequest.GET現在、空のQueryDictオブジェクトを返します。

ライブラリなしでこれを行う方法を学びたいので、Djangoについて詳しく知ることができます。

回答:


662

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がパラメータを認識する唯一の方法は '?param ='ですか?HTTP.GETでURLconfを使用する方法はありますか?/ param / 2を実行します。
ステー

3
URLconfとregexのキャプチャに関する私の応答の2番目の部分を確認してください。
camflan 2008

2
問題ない。GETを使用してフォームを送信する場合はrequest.GETを使用し、POSTを使用してフォームを送信する場合はrequest.POSTを使用します。URLに可変セクションを設定するだけの場合は、URLconf / view引数です。
camflan 2008

10
クラスベースのビューはどうですか?
ユーザー

8
使用できるクラスベースのビューself.kwargs['parameter']
Royendgel Silberie 2017

336

camflanの説明を明確にするために、あなたが持っているとしましょう

  • ルール 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)は解析され、パラメータはQueryDictin として格納されます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をもう少しよく理解するのに役立ちました。
Mark

2
名前に言及せずにすべてのパラメーター値を取得する方法
numerah

@numerah request.GETはPython辞書です。たとえば、request.GET.items()を繰り返すことができます。
akaihola

完璧な答え。
ジェイギース2017

1
アップデートで書かれた習慣に従うことが好ましい理由は何ですか?(URLパスとGET
パラメーター

55

GETの使用

request.GET["id"]

POSTの使用

request.POST["id"]

27
これは既存のキーで機能しますが、camflanとakaiholaによる回答では.get()を使用KeyErrorして、キーが欠落している場合の例外を回避しています。同じことをするのが賢明でしょう(例えばrequest.POST.get('id', ''))。
非常に優れた監督、2015

25
def some_view(request, *args, **kwargs):
    if kwargs.get('q', None):
        # Do something here ..


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).

ここに例があります(views.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)」にさらに光を当てることができますか?state__nameの二重下線は何を意味していますか。
Subbu 2018

1
ここで「状態」はテーブルであり、「名前」はこのテーブルにファイルされます。Djangoのフィルターでは、state__nameは「state」テーブルのフィールド「name」の値を参照します。
エリックアンドリュース

これは他のものと比較して機能しました。
シビッシュ

17

時間を節約できるヒントを共有したいと思います。
このようなものをurls.pyファイルで使用する場合:

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

それは基本的に意味しwww.example.com/<username>ます。それ以外の場合は、彼らの下のフォロー、すなわちアクセス1は、そのURLのエントリを持つ原因の競合を起こしやすいので、あなたのURLエントリの最後にそれを置くようにしてくださいますあなたに素敵なエラーを与える:User matching query does not exist.

私はちょうどそれを自分自身を経験してきました。それが役に立てば幸い!


2
さらに、この場合は、ユーザー名が他のURLエンティティと競合しないことを確認する必要があります。
DrKaoliN 2013年

13

URLが次のようになっている場合に備えて、2つの一般的な方法があります。

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

v1:

特定のキーが必須の場合は、以下を使用できます。

key_a = request.GET['a']

これはa、キーが存在する場合は値を返し、存在しない場合は例外を返します。

v2:

キーがオプションの場合:

request.GET.get('a')

引数なしで試すことができますが、これはクラッシュしません。したがって、それをラップして例にtry: except:戻ることができますHttpResponseBadRequest()。これは、特別な例外処理を使用せずに、コードを単純にする簡単な方法です。


テンプレートからクエリパラメータを検出するにはどうすればよいですか?
Akin Hwan


5

これらのクエリは現在2つの方法で実行されます。クエリパラメータ(GET)にアクセスする場合は、次のクエリを実行できます。

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

POSTによって渡されたパラメーターにアクセスする場合は、次の方法でアクセスする必要があります。

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

'get()'を使用して辞書(QueryDict)にアクセスすると、デフォルト値を設定できます。上記の場合、「ステータス」または「ロール」が通知されない場合、値はなしです。


0

これは、実装できる別の代替ソリューションです。

URL構成で。:

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

ビューで:

list2 = queryparams.split("&")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.