django - url模式和if-else视图

时间:2012-09-13 22:36:51

标签: django url

我正在尝试在django 1.4中构建(有点RESTFul)URL,允许按书章过滤,然后还可以预订章节。但是,截至目前,只有特定章节部分的网址返回信息。当我只输入章节时,页面显示没有任何内容。

我的urlpatterns在settings.py中:

url(r'^(?i)book/(?P<chapter>[\w\.-]+)/?(?P<section>[\w\.-]+)/?$', 'book.views.chaptersection'),

我的views.py:

from book.models import contents as C
def chaptersection(request, chapter, section):

if chapter and section:

    chapter = chapter.replace('-', ' ')
    section = section.replace('-', ' ')

    info = C.objects.filter(chapter__iexact=chapter, section__iexact=section).order_by('symb')
    context = {'info':info}
    return render_to_response('chaptersection.html', context, context_instance=RequestContext(request))

elif chapter:

    chapter = chapter.replace('-', ' ')

    info = C.objects.filter(chapter__iexact=chapter).order_by('symb')
    context = {'info':info}
    return render_to_response('chaptersection.html', context, context_instance=RequestContext(request))

else:
    info = C.objects.all().order_by('symb')
    context = {'info':info}
    return render_to_response('chaptersection.html', context, context_instance=RequestContext(request))

再次......对于第1章第1节,“book / 1/1”的URL工作正常,但不是“book / 1”,这应该在技术上显示第1章的所有内容。我没有收到错误,但是同时,屏幕上没有显示任何内容。

1 个答案:

答案 0 :(得分:2)

您已将尾部斜杠设为可选,但您的正则表达式仍然需要至少一个字符用于section参数。

尝试更改

(?P<section>[\w\.-]+)

(?P<section>[\w\.-]*)

就个人而言,我发现声明两个URL模式而不是带有可选参数的URL模式更清楚。

url(r'^(?i)book/(?P<chapter>[\w\.-]+)/$', 'book.views.chaptersection'),
url(r'^(?i)book/(?P<chapter>[\w\.-]+)/(?P<section>[\w\.-]+)/$', 'book.views.chaptersection'),

这需要对chaptersection视图进行少量调整,以使section成为可选参数:

def chaptersection(request, chapter, section=None):