2010-02-02 4 views
1

그래서이 장고 응용 프로그램을 가지고 있고 데이터의보다 세분화 된 뷰를 제공하는 새로운 기능을 계속 추가하고 있습니다. 그래서점점 복잡한 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 복잡성을 줄이는 현명한 방법은?

답변

3

GET 매개 변수 또는 django-filter을 사용하지 않는 이유는 결과를 다르게 필터링/그룹화하는 것일뿐입니다.

GET을 사용하는 이유는 구현하기가 쉽기 때문입니다. URL 솔루션/search/foo/user/bar/및/user/bar/search/foo /는 2 개의 이름 똑같은 내용이야. GET 매개 변수 솔루션에서 모든 동일한 페이지. 이 일에

+1

여기에는 몇 가지 유효한 점이 있습니다. URL은 필터링이 아닌 고유하게 리소스를 식별하기위한 것입니다. –

+0

그래, 그게 내 질문의 하단에 : 꽤 많이 우회 urls.py' 및 뷰 기능 내에서 요청 문자열에서 쿼리 인수를 구문 분석하는거야. 장고 필터가 내가 원하는 도구인지는 모르겠지만 필자가 인식하는 해결책을 확인해 주셔서 감사합니다. . . – dannyman

+0

하지만 솔루션에서 여전히 URL을 사용하고 있으며 django의 URL 라우팅 메커니즘을 사용하지 않고 직접 URL을 사용하고 있습니다. GET 매개 변수를 사용하면 코드의 길이가 절반이고 명확합니다. –

0

하자 초점 :

# 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'), 

좀 있다고 가정 : 그래서

def index(year=2010, month=2, day=2, page=0): 
     # whatever 

, 왜 당신은, 예를 들어, 하나의 당신에게 정규 표현식에 결합하지 않는다

 r'^date/(?P<year>\d{4})(-(?P<month>\d{2})(-(?P<day>\d{2}))?)?$ 

나는 이것을 시도하지는 않았지만, 이런 식으로 동작 할 것이라고 확신한다.

편집 : 다시 쓰기 정규 표현식에 작동 할 수 있지만 당신이 여기에 몇 가지 메타 문제를 가지고있을 수 있기 때문에

, Ofri Raviv의 대답 좀 봐.

관련 문제