为什么Django不能反转这个带有一个可选参数的url正则表达式?

时间:2013-10-10 16:51:00

标签: regex django routing django-urls

我的root url conf中的blog下有一个名为app的应用程序:

urlpatterns = patterns('',                                                                                                                                                                                                                                                    
    url(r'^blog/', include('blog.urls', namespace='blog')),                   
)

这是我对blog.urls下的博客索引的正则表达式:

urlpatterns = patterns('', 
    url(r'^(?:(?P<page_num>\d+)/)?$', views.index, name='index'),
)

这是我的博客索引视图:

def index(request, page_num):
    if not page_num:
        return redirect('blog:index', args=[1])
    post_list = Post.objects.all()
    p = Paginator(post_list, 10)

    try:
        posts = p.page(page_num)
    except PageNotAnInteger:
        posts = p.page(1)
    except EmptyPage:
        posts = p.page(p.num_pages)

    return render(request, 'blog/index.html', { 'post_list': posts })

基本上,我想要的是在您导航到/blog/1/时将网址重定向到/blog/,这就是我page_num可选的原因。当然,转到/blog/n/ n /blog/所在的/blog/1/应导航到相应的分页页面。

但是,当我转到blog.urlsurlpatterns = patterns('', url(r'^$', views.index, name='index'), url(r'^(?<page_num>\d+)/$', views.index, name='index'), ) 时,没有任何内容加载,最终Django给了我“收到数据”错误。我觉得我正在写我的正则表达式错误,但我尝试了一些排列并且没有任何运气(大多数给我“找不到页面”错误)。

我还在官方Django文档中尝试过p.page_range,即在def index(request, page_num=1): ....(the rest the same as above)... 中指定此内容:

/blog/

这在我的博客索引视图中:

TypeError at /blog/
index() takes exactly 2 arguments (1 given)

但是当我导航到/blog/1/时,这会给我以下错误:

{{1}}

当我转到{{1}}时,收到“没有收到数据”错误。

1 个答案:

答案 0 :(得分:5)

视图函数page_num属性没有默认值,因此可选。变化:

def index(request, page_num):

def index(request, page_num=None):

作为旁注。您可能还应该更改代码:

if not page_num:

if page_num is None:

这更明确。否则,会有多个不同的值会触发重定向,例如0