Django url反向和正则表达式

时间:2011-08-25 12:09:10

标签: python django reverse

我在我的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)`

我使用这个来进行简单的分页,如果用户没有输入任何东西'/ blog /'返回他/她的第一页,否则返回他/她想要的页面。

它的工作。但是当我想使用reverse()函数时会出现问题。

当我输入交互式shell时:

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 个答案:

答案 0 :(得分:2)

我认为为了使这项工作正常,你必须有两个网址:

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 :(得分:1)

考虑URL正则表达式。

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

(假设您的意思是blog/而不是page/。)

这包含两组。

  • (blog/(?P<page>\d+)/)未命名,因此$ 1
  • (?P<page>\d+),其名称为“page”。

您不想捕获那里的第一个群组,因此您应该使用(?:...)而不是(...)

然后,尝试使用^(?:blog/(?P<page>\d+)/)?$作为匹配正则表达式。然后,尝试reverse('index_path', kwargs={'page': 1})