チュートリアルで説明されているように、URL内のパラメータを取得するために現在正規表現を定義しています。 HttpRequest
オブジェクトの一部としてURLからパラメータにアクセスするにはどうすればよいですか?私のHttpRequest.GET
は現在空のQueryDict
オブジェクトを返します。
ライブラリを使わずにこれを行う方法を学びたいので、Djangoをよりよく知ることができます。
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
Camflanの説明を明確にするために、あなたが持っているとしましょう。
url(regex=r'^user/(?P<username>\w{1,50})/$', view='views.profile_page')
http://domain/user/thaiyoshi/?message=Hi
に対する着信要求URLディスパッチャルールはURL path (ここでは"user/thaiyoshi/"
)の一部をキャッチし、それらをリクエストオブジェクトと共にview関数に渡します。
クエリ文字列(ここでは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パスとクエリパラメータのどちらを使用するかを決定するときに、次のことが役に立ちます。
/blog/post/15/
(/blog/posts/?id=15
ではなく)/blog/post/15/?show_comments=1
または/blog/posts/2008/?sort_by=date&direction=desc
/blog/post/2008/09/30/Django-urls/
GETを使う
request.GET["id"]
POSTを使う
request.POST["id"]
def some_view(request, *args, **kwargs):
if kwargs.get('q', None):
# Do something here ..
時間を節約するためのヒントを共有したいと思います。urls.py
ファイルで次のようなものを使用する場合:
url(r'^(?P<username>\w+)/$', views.profile_page,),
これは基本的にwww.example.com/<username>
を意味します。 URLエントリの最後に配置するようにしてください。そうしないと、以下のURLエントリと競合する傾向があります。つまり、いずれかにアクセスするとwill Niceエラーが発生します:User matching query does not exist.
自分でそれを体験しました。それが役に立てば幸い!
あなたのURLがそのように見える場合のためにそれをする2つの一般的な方法があります:
https://domain/method/?a=x&b=y
v1:
特定のキーが必須の場合は、次のものを使用できます。
key_a = request.GET['a']
Keyが存在する場合はa
の値を返し、存在しない場合はExceptionを返します。
v2:
キーがオプションの場合
request.GET.get('a')
何の引数もなくてもこれを試すことができます。これはクラッシュしません。それで、あなたはそれをtry: except:
でラップして、そして例でHttpResponseBadRequest()
を返すことができます。これは、特別な例外処理を使用せずにコードを複雑にしないための簡単な方法です。
request
オブジェクトしかない場合は、request.parser_context['kwargs']['your_param']
を使用できます。
これはまさにあなたが求めたものではありませんが、 このスニペット はtemplates
でquery_strings
を管理するのに役立ちます。
ここに私自身のオプションをいくつか追加したいのですが。次のように、urls.pyでパスを設定する方法を誰かが疑問に思うでしょう。
domain/search/?q=CA
クエリを起動できるように.
実際、urls.pyでそのような経路を設定する必要はありません。あなたが設定する必要があるのはurls.pyの単なるルートです
urlpatterns = [
path('domain/search/', views.CityListView.as_view()),
]
また、 http://サーバー名:ポート/ドメイン/ 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"
現在、これらのクエリは2つの方法で実行されます。クエリパラメータ(GET)にアクセスする場合は、次のクエリを実行できます。
http://myserver:port/resource/?status=1
request.query_params.get('status', None) => 1
POSTによって渡されたパラメーターにアクセスする場合は、次の方法でアクセスする必要があります。
request.data.get('role', None)
'get()'で辞書(QueryDict)にアクセスすると、デフォルト値を設定できます。上記の場合、「status」または「role」が通知されない場合、値はNoneです。