그래서이 장고 응용 프로그램을 가지고 있고 데이터의보다 세분화 된 뷰를 제공하는 새로운 기능을 계속 추가하고 있습니다. 그래서점점 복잡한 Django URL 뷰를 효율적으로 관리 하시겠습니까? (urls.py)
# Simple enough . . .
(r'^$', 'index'),
(r'^date/(?P<year>\d{4})$', 'index'),
(r'^date/(?P<year>\d{4})-(?P<month>\d{2})$', 'index'),
(r'^date/(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})$', 'index'),
(r'^page/(?P<page>\d+)$', 'index'),
, 그래, 기본보기, 날짜보기, 매겨진보기, 다음, 사용자가 특정 URL에 대한 비슷한 설정 :
문제의 빠른 아이디어를 제공하기 위해, 여기urls.py
의 하위 집합
# user
(r'^user/(?P<username>\w+)$', 'index_username'),
(r'^user/(?P<username>\w+)/date/(?P<year>\d{4})$', 'index_username'),
(r'^user/(?P<username>\w+)/date/(?P<year>\d{4})-(?P<month>\d{2})$', 'index_username'),
(r'^user/(?P<username>\w+)/date/(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})$', 'index_username'),
(r'^user/(?P<username>\w+)/page/(?P<page>\d+)$', 'index_username'),
그런 다음 다시 팀과 비슷합니다. . .
# Team View
(r'^team/(?P<team>\w+)$', 'index'),
(r'^team/(?P<team>\w+)/date/(?P<year>\d{4})$', 'index'),
(r'^team/(?P<team>\w+)/date/(?P<year>\d{4})-(?P<month>\d{2})$', 'index'),
(r'^team/(?P<team>\w+)/date/(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})$', 'index'),
(r'^team/(?P<team>\w+)/page/(?P<page>\d+)$', 'index'),
지금, 나는 "검색"보기를 추가하려면, 정말 난 그냥 위의 URL에 많은 끝에이 추가 좋을 거라고 생각, 그래서 같은 히트 수 :
를/search/foo
/user/fred/date/2010-01/search/baz
그리고 난 그냥 적절하게 결과를 제약 할 수있는 뷰에 검색 매개 변수를 전달 할 수있다.
하지만 사용자, 팀 및 날짜 별보기에이를 적용하려면 urls.py
에 12 개의 새로운 행이 추가 된 것입니다. 그리고 또 다른 잠재적 인보기 옵션을 추가 할 때마다 (예 : 페이지가 매겨진 검색 결과)? . . 더 나은 방법이 되어야만하는 것처럼 느껴집니다.
내 연구에서 대답은 다음과 같을 것입니다.
1) 더 넓은 일치가 urls.py
내에 있고 뷰 기능이 쿼리 문자열을 구문 분석하도록하십시오.
2) 의 "일반 패턴과 일치하면 뷰 기능으로 전달할 때 매개 변수를 포함"이라고 말할 수있는 약간의 정규 표현식 논리가 여러 번 나타날 수 있습니다. 그러나 그것은 악몽 일 가능성이 있습니다.
누구나 복잡한 URL을 효율적으로 관리하는 현명한 해결책을 찾았습니까? 특정 시점에서 쿼리 문자열에서 매개 변수를 구문 분석하기 위해 뷰 자체에 매개 변수 일치 논리를 전달하는 것이 가장 간단하다고 생각합니다. 그래서, 뷰의 상단에 내가 다음과 같습니다 일부 코드가있을 수 있습니다 : 그래서
# Date Queries
re_ymd = re.compile('date/(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})')
re_ym = re.compile('date/(?P<year>\d{4})-(?P<month>\d{2})')
re_y = re.compile('date/(?P<year>\d{4})')
if(re_ymd.search(qs)):
year = re_ymd.search(qs).group('year')
month = re_ymd.search(qs).group('month')
day = re_ymd.search(qs).group('day')
elif(re_ym.search(qs)):
year = re_ym.search(qs).group('year')
month = re_ym.search(qs).group('month')
elif(re_y.search(qs)):
year = re_y.search(qs).group('year')
# Pagination queries
re_p = re.compile('page/(?P<page>\d+)')
if(re_p.search(qs)):
page = re_p.search(qs).group('page')
# Search queries
re_s = re.compile('search/(?P<search>\w+)')
if(re_s.search(qs)):
search = re_s.search(qs).group('search')
을하다 내가 urls.py
에 도입 된 repetetive 복잡성을 줄이는 현명한 방법은?
여기에는 몇 가지 유효한 점이 있습니다. URL은 필터링이 아닌 고유하게 리소스를 식별하기위한 것입니다. –
그래, 그게 내 질문의 하단에 : 꽤 많이 우회 urls.py' 및 뷰 기능 내에서 요청 문자열에서 쿼리 인수를 구문 분석하는거야. 장고 필터가 내가 원하는 도구인지는 모르겠지만 필자가 인식하는 해결책을 확인해 주셔서 감사합니다. . . – dannyman
하지만 솔루션에서 여전히 URL을 사용하고 있으며 django의 URL 라우팅 메커니즘을 사용하지 않고 직접 URL을 사용하고 있습니다. GET 매개 변수를 사용하면 코드의 길이가 절반이고 명확합니다. –