質問

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

ライブラリを使用せずにこれを行う方法を学びたいので、Djangoをよりよく知ることができます。

役に立ちましたか?

解決

URLが次のような場合:domain/search/?q=haha 、  次に、request.GET.get('q', '')を使用します。

qは必要なパラメーターで、''が見つからない場合はURLconfがデフォルト値です。

ただし、代わりにregex を設定するだけの場合、views.pyからのキャプチャは引数(または名前付き引数)として関数に渡されます。

例:

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

その後、あなたの<=>にあなたはいるでしょう

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

他のヒント

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

  • ルールurl(regex=r'^user/(?P<username>\w{1,50})/$', view='views.profile_page')
  • a http://domain/user/thaiyoshi/?message=Hi
  • への着信リクエスト

URLディスパッチャルールは、URL path (ここでは"user/thaiyoshi/")の一部をキャッチし、それらをリクエストオブジェクトとともにビュー関数に渡します。

クエリ文字列(ここではmessage=Hi)が解析され、パラメーターはQueryDictrequest.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/

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+)/

基本的には www.example.com/<username> を意味します。 URLエントリの最後に配置してください。そうしないと、以下のURLエントリと競合する傾向があります。つまり、いずれかにアクセスすると エラーが発生します。< code>ユーザーマッチングクエリが存在しません。

私は自分でそれを体験しました。役に立てば幸いです!

, views.profile_page,),

基本的には www.example.com/<username> を意味します。 URLエントリの最後に配置してください。そうしないと、以下のURLエントリと競合する傾向があります。つまり、いずれかにアクセスすると エラーが発生します。< code>ユーザーマッチングクエリが存在しません。

私は自分でそれを体験しました。役に立てば幸いです!

request オブジェクトのみがある状況では、 request.parser_context ['kwargs'] ['your_param']

を使用できます

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

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

v1:

特定のキーが必須の場合は、次を使用できます:

key_a = request.GET['a']

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

v2:

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

request.GET.get('a')

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

これはまさにあなたが求めたものではありませんが、このスニペットは管理に役立ちます< templates のcode> query_strings 。

ここで、自分自身のオプションをいくつか追加したいと思います。

など、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"
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top