request.GET에서 URL 매개 변수 캡처


457

현재 튜토리얼에서 설명한 것처럼 URL에서 매개 변수를 캡처하기 위해 정규 표현식을 정의하고 있습니다. URL에서 매개 변수에 어떻게 액세스합니까?HttpRequest객체의 합니까? 내 HttpRequest.GET현재 빈 QueryDict개체를 반환 합니다.

장고를 더 잘 알 수 있도록 라이브러리 없이이 작업을 수행하는 방법을 배우고 싶습니다.

답변:


660

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를하고 싶습니다.
sutee

3
URLconf 및 정규식 캡처에 대한 응답의 두 번째 부분을 확인하십시오.
camflan

2
문제 없어요. GET을 사용하여 양식을 제출하는 경우 request.GET을 사용하고 POST를 사용하여 양식을 제출하는 경우 request.POST를 사용하고 가변 섹션을 갖도록 URL을 구성하려는 경우 URLconf / view 인수입니다.
camflan

10
클래스 기반 뷰는 어떻습니까?
사용자

8
클래스 기반 뷰의 경우self.kwargs['parameter']
Royendgel Silberie

335

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) 구문 분석 및 매개 변수가 저장됩니다 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
이것은 정말 잘 작성된 답변입니다. 그것은 장고를 조금 더 잘 이해하는 데 도움이되었습니다.
Mark

2
이름을 언급하지 않고 모든 파라미터 값을 얻는 방법
numerah

@numerah request.GET은 파이썬 사전입니다. 예를 들어 request.GET.items ()를 통해 반복 할 수 있습니다.
akaihola

완벽한 답변.
Jay Geeth

1
업데이트에 작성된 습관을 따르는 것이 바람직한 이유는 무엇입니까? (URL 경로와 GET 매개 변수를 함께 사용하는 경우)
m0etaz

55

GET 사용

request.GET["id"]

POST 사용

request.POST["id"]

27
이것은 기존 키에서 작동하지만 camflan 및 akaihola의 답변은 .get ()을 사용 KeyError하여 키가 누락 된 경우 예외 를 피 했습니다. 동일한 작업을 수행하는 것이 좋습니다 (예 :) request.POST.get('id', '').
vastsupersupermanman

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 : // 서버 : 포트 / 도메인 / 검색 / 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 December

1
여기서 "state"는 테이블이고 "name"은이 테이블에 정리되어 있습니다. Django의 필터에서 state__name은 "state"테이블의 "name"필드 값을 참조합니다.
Eric Andrews

이것은 다른 것에 비해 효과가있었습니다.
Sibish

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 항목과 충돌하지 않는지 확인할 수 있습니다.
DrKaoliN

13

URL이 다음과 같은 경우 두 가지 일반적인 방법이 있습니다.

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

이러한 쿼리는 현재 두 가지 방법으로 수행됩니다. 조회 매개 변수 (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.