문제

현재 자습서에 설명 된대로 URL에서 매개 변수를 캡처하기 위해 정규식을 정의하고 있습니다. URL에서 매개 변수에 액세스하는 방법은 HttpRequest 물체? 나의 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의 일부를 잡을 것입니다. (여기 "user/thaiyoshi/") 그리고 요청 객체와 함께보기 함수로 전달하십시오.

쿼리 문자열 (여기 message=Hi)는 구문 분석되고 매개 변수는 a로 저장됩니다 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"]

게시물 사용

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 항목과 충돌이 발생하기 쉽기 때문에 그 중 하나에 액세스하기 쉽기 때문입니다. ~ 할 것이다 좋은 오류를 제공하십시오. User matching query does not exist.

방금 직접 경험했습니다. 도움이되기를 바랍니다!

당신이있는 상황에 대해 request 당신이 사용할 수있는 객체 request.parser_context['kwargs']['your_param']

URL이 다음과 같이 보일 경우이를 수행하는 두 가지 일반적인 방법이 있습니다.

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

v1 :

특정 키가 필수 인 경우 다음을 사용할 수 있습니다.

key_a = request.GET['a']

이것은 값을 반환합니다 a 키가 존재하고 예외가 아닌 경우.

v2 :

키가 선택 사항 인 경우 :

request.GET.get('a')

논쟁없이 시도해 볼 수 있습니다. 이것은 충돌하지 않을 것입니다. 그래서 당신은 그것을 포장 할 수 있습니다 try: except: 그리고 반환 HttpResponseBadRequest() 예를 들어. 이것은 특별한 예외 처리를 사용하지 않고 코드를 덜 복잡하게 만드는 간단한 방법입니다.

이것은 정확히 당신이 요청한 것이 아니라 이 스 니펫 관리에 도움이됩니다 query_strings 안에 templates.

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