我在我的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')),
答案 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})
。