문제

Regex가 Django를 사용하여 어떤 일이 일치하지 않은 경우에 기본 매개 변수를 동작으로 전달할 수있는 방법이 있습니까?


urlpatterns = patterns('',(r'^test/(?P<name>.*)?$','myview.displayName'))

#myview.py
def displayName(request,name):
      # write name to response or something

URLPatterns의 세 번째 매개 변수를 ''사전에 포함시키고 이름 매개 변수에 메소드의 기본값을 제공했지만 그 중 어느 것도 작동하지 않았습니다. 이름 매개 변수는 항상없는 것 같습니다. 기본값을 설정할 수 있다면 실제로 수표를 코딩하고 싶지 않습니다.

설명 : 다음은 내가 변경 한 내용의 예입니다.


def displayName(request,name='Steve'):
      return HttpResponse(name)
#i also tried

urlpatterns = patterns('',
      (r'^test/(?P<name>.*)?$',
        'myview.displayName',
        dict(name='Test')
      )
)

내 브라우저를 뷰에서 가리키면 'None'텍스트가 표시됩니다.

어떤 아이디어?

도움이 되었습니까?

해결책

문제는 패턴이 'test/'와 일치 할 때 REGEX가 캡처 한 GroupDict에 '이름'=> 없음을 포함한다는 것입니다.

>>> url.match("test/").groupdict()
{'name': None}

이것은보기가 호출 될 때, 내가 기대하는 것을 사용하여 다음과 유사하다는 것을 의미합니다.

view(request, *groups, **groupdict)

다음과 같습니다.

view(request, name = None)

'test/'의 경우, 이름은 할당되지 않은 것이 아니라 아무도 할당되지 않습니다.

이것은 당신에게 두 가지 옵션을 남깁니다. 당신은 할 수 있습니다 :

  1. 뷰 코드에서 어떤 종류의 해킹이 아닌지 명시 적으로 확인하십시오.
  2. URL 디스패치 규칙을 다시 작성하여 이름을 캡처하고 이름이 제공되지 않을 때 캡처 할 두 번째 규칙을 도입하십시오.

예를 들어:

urlpatterns = patterns('',
    (r'^test/(?P<name>.+)$','myview.displayName'), # note the '+' instead of the '*'
    (r'^test/$','myview.displayName'),
)

두 번째 접근 방식을 수행 할 때 캡처 패턴없이 메소드를 호출하고 Python이 기본 매개 변수를 처리하거나 다른 뷰를 호출 할 수 있습니다.

다른 팁

생각 당신은 할 수 있습니다 def displayName(request, name=defaultObj); 그것이 제가 과거에 한 일입니다. 기본값을 무엇으로 설정 했습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top