django如何将参数从url传递到视图

时间:2018-07-30 23:11:50

标签: python regex django url parameters

我正在尝试在问题网址的末尾附加参数no_rep,作为显示不同视图的信号。我正在使用 Django 1.8 ,并遵循askbot的网址格式。

这是 url.py

url(
        (r'^%s(?P<id>\d+)/' % QUESTION_PAGE_BASE_URL.strip('/') +
        r'(%s)?' % r'/no-rep:(?P<no_rep>\w+)'),
        views.readers.question,
        name='question'
    ),

我试图根据URL中no_rep的值来显示不同的显示。

这是视图

def question(request, id, no_rep):
    if no_rep == '1':
        request.session['no_rep'] = True
    else:
        request.session['no_rep'] = False

我找不到有关+,%和?的信息。这样做,这可能是问题所在。有人可以解释正则表达式如何与基本网址一起使用吗?当我输入网址http://localhost:8000/question6/test-question/no_rep:1时,request.session['no_rep']应该设置为true,但事实并非如此。我想念什么?

2 个答案:

答案 0 :(得分:0)

所有替换(%):r'^question(?P<id>\d+)/(/no-rep:(?P<no_rep>\w+))?'之后,您的url如下所示:
1. test-question
的一部分 2.您在命名组no_rep(这是合法的,但not recommended)周围有奇数分组

对于http://localhost:8000/question6/test-question/no_rep:1这样的网址,您的网址格式应如下所示:
r'^%s(?P<id>\d+)/test-question/(?:no_rep:(?P<no_rep>\d+))?' % QUESTION_PAGE_BASE_URL.strip('/')(如果您也希望字母匹配,则可以在\ w +的最后一组更改\ d +)。

关于非捕获组(?:...)以及+和?的含义。您可以阅读Python re模块的documentation

答案 1 :(得分:0)

将您的网址格式更改为类似的内容,

urlpatterns = [
                  url(r'question/(?P<id>\d+)/no-rep/(?P<no_rep>\w+)/', question),

              ]

OR

QUESTION_PAGE_BASE_URL = "question"
urlpatterns = [
                  url(r'{QUESTION_PAGE_BASE_URL}/(?P<id>\d+)/no-rep/(?P<no_rep>\w+)/'.format(
                      QUESTION_PAGE_BASE_URL=QUESTION_PAGE_BASE_URL), question),

              ] + router.urls



注意:
最好不要使用 named groups 之类的 id 和一些字符串或字符(如网址,{localhost:8000/question6/