2011-08-25 2 views
1

나는, 사용자가 '/ 블로그 아무것도 예를 입력하면 내 urlpatterns url(r'^(page/(?P<page>\d+)/)?$', 'index', name = 'index_path')장고 URL 역 및 정규 표현식

를이있어 여기 내 views.py 파일 나는 간단한 페이지 매기기에 이것을 사용

def index(request, page=1): 
    posts = Post.objects.filter(published = True) 
    paginated_posts = Paginator(posts, 20) 

    try: 
     target_page = paginated_posts.page(page) 
    except EmptyPage: 
     return redirect(reverse('index_path')) 

    response_dict = { 
     'posts': target_page.object_list, 
     'page': target_page, 
     } 

    return render(request, 'posts/index.html', response_dict)` 

입니다/'그/그녀의 첫 번째 페이지를 반환, 그렇지 않으면 그/그녀가 원하는 그녀/그녀의 페이지를 반환합니다.

작동합니다. 하지만 reverse() 함수를 사용하려고 할 때 문제가 있습니다.

나는 대화 형 쉘에서 입력 할 때 :

reverse("index_path") 

내가 가지고 :

'/blog/' 

하지만이 수행

reverse("index_path", args=(1,)) 

내가 오류를 말한다있어하는 :

NoReverseMatch: Reverse for 'index_path' with arguments '(1,)' and keyword arguments '{}' not found. 

PS :

url(r'^blog/', include('app.posts.urls')), 
+0

상단의 url 패턴에'page /'가 아닌'blog /'를 사용한다고 가정합니까? –

+0

죄송합니다. – yigit

답변

2

내가 제대로 당신이 두 개의 URL이해야이 일을하기 위해 생각 : 당신이 역 다음

url(r'^page/(?P<page>\d+)$', 'index', name = 'index_path_page'), 
url(r'^$', 'index', name = 'index_path'), 

을, 당신은 두 가지 옵션이 있습니다

reverse('index_path_page', args=[1]) 
# or 
reverse('index', args=[1]) # pulls by the name of the view. 

두 번째는 아니다 권장되지만 장소에서보다 쉬운 논리로 이어질 수 있습니다.

+0

제대로 작동합니다. 하지만 난 왜 그걸 위해 하나의 URL 패턴을 사용할 수없는 이해가 안돼? – yigit

+0

기본적으로 리버스가 그렇게 똑똑하지 않습니다. 전체 정규식 파서가 없으므로 선택적 매개 변수를 처리 할 수 ​​없습니다. –

1

urls.py 내 주인의 URL 정규 표현식을 고려하십시오.

r'^(blog/(?P<page>\d+)/)?$' 

(당신이 page/보다는 blog/을 의미 가정.)

이 두 그룹이 포함되어 있습니다. 이름과

  • (blog/(?P<page>\d+)/) "페이지"로 이름을 붙일 수있다, 따라서 $ (1)
  • (?P<page>\d+).

당신은 당신이 (...)보다는 (?:...)를 사용해야하므로,이 첫 번째 그룹을 캡처하고 싶지 않아요.

그러면 일치 정규식으로 ^(?:blog/(?P<page>\d+)/)?$을 사용해보세요. 그런 다음 reverse('index_path', kwargs={'page': 1})을 시도하십시오.