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

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

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



답변

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 경로의 일부 (여기서 "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/

답변

GET 사용

request.GET["id"]

POST 사용

request.POST["id"]


답변

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


답변

request사용할 수 있는 개체 만있는 상황request.parser_context['kwargs']['your_param']


답변

여기에 자신의 옵션을 추가하고 싶습니다. 누군가 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"


답변

시간을 절약 할 수있는 팁을 공유하고 싶습니다. 파일
에서 이와 같은 것을 사용하려는 경우 urls.py:

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

기본적으로 의미 www.example.com/<username>합니다. 그것은 아래에 따르는 URL 항목과 원인 충돌하는 경향이있다, 그렇지 않으면 때문에, 당신의 URL 항목의 끝에 배치해야합니다, 그 중 즉, 액세스 한 것이다 당신에게 좋은 오류를 줄 : User matching query does not exist.

난 그냥 나 자신을 경험 했어요; 그것이 도움이되기를 바랍니다!