Джанго URL обратный и регулярное выражение - PullRequest
1 голос
/ 25 августа 2011

Я получил это в своих urlpatterns url(r'^(page/(?P<page>\d+)/)?$', 'index', name = 'index_path')

и вот мой файл 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: в моем мастер urls.py

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

Ответы [ 2 ]

2 голосов
/ 25 августа 2011

Я думаю, что для правильной работы вам понадобится два 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.

Второе не рекомендуется, но, безусловно, может привести к упрощению логики в некоторых местах.

1 голос
/ 25 августа 2011

Рассмотрим регулярное выражение URL.

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

(Предполагается, что вы имели в виду blog/, а не page/.)

Содержит две группы.

  • (blog/(?P<page>\d+)/) без имени и, следовательно, $ 1
  • (?P<page>\d+), который называется "страница".

Вы не хотите захватывать первую группу там, поэтому вы должны использовать (?:...) вместо (...).

Итак, попробуйте использовать ^(?:blog/(?P<page>\d+)/)?$ в качестве регулярного выражения соответствия. Затем попробуйте reverse('index_path', kwargs={'page': 1}).

...