从Django中的URL获取变量中的两个字符串

时间:2011-05-28 21:47:40

标签: python django url

我在向视图发送多个变量时遇到了一些麻烦。

我的urls.py如下:

urlpatterns = patterns('',
    url(r'^rss/(?P<anything>[^/]+)/$', 'rss.rssama.views.makerss', name='anything'),
    url(r'^$', 'rss.rssama.views.home'),    
)

views.py

def maakrss(request, anything):

所以现在需要www.mydomain.com/rss/[anything]/并向我的观点发送'任何'。但是我还希望它将另一个字符串发送到views.py,例如:

www.mydomain.com/rss/ [任何数量] / [anystring] /

我尝试了这个但是没有用:

url(r'^rss/(?P<anynumber>[^/]+)/(?P<anystring>[^/]+)/$', 'rss.rssama.views.makerss', name='anynumber', name2='anystring'),

但是这不起作用,它给出了这个错误:重复关键字参数(urls.py,第17行)

所以我的问题:如何让它从网址中提取两个字符串?

3 个答案:

答案 0 :(得分:27)

首先,正则表达式部分应如下所示:

r'^/rss/(?P<anynumber>\d+)/(?P<anystring>.+)/$'

<...>部分中的那些字符串允许您为正则表达式匹配的任何内容命名。然后Django将使用该名称将值传递给您的函数。因此,您的函数必须具有相同名称的参数。在这种情况下,Django将获取名为anynumber的值,并将该值用于函数的参数anynumberanystring也是如此,这个系统使您不必担心函数参数的顺序。

\d+将匹配一个或多个数字字符(数字)。最好将正则表达式限制为只匹配数字,如果这是你想要捕获的,而不是任何字符,并希望只出现数字。如果您想将数字部分限制为一定数量的数字,您可以使用\d{1,4}从一到四位数。

下一部分(?P<anystring>.+)将捕获由一个或多个任何字符组成的字符串。这实际上匹配'letters/moreletters'之类的东西,包括斜杠。 Python正则表达式中有许多“特殊序列”可能有所帮助。要仅匹配数字,字母和下划线字符,请使用\w,如(?P<anystring>\w+)中所示。为了更宽松但忽略空格或任何其他无意义的(?P<anystring>[a-zA-Z1-9:;_{}\[\]]来捕捉大量的人物。确保逃避正则表达式中可能是特殊字符的任何内容。但是,要保守。如果您允许太多选项知道您将在以后解决什么类型的错误。

现在进入url函数的name参数。该名称不是它将捕获的模式传递给您的函数。它是视图函数的特定类调用的名称,可以在其他上下文中用作模板标记{% url view-name arg1 arg2 %}的简写。所以,你已经拥有的名称,“任何东西”,指的是对你的视图函数的调用,传递一个恰好被称为任何东西的关键字参数。对于要传递两个字符串的情况,请为其指定一个名称,例如“rss-number-string”以表示您要采用的参数,或者指定一个名称,该名称指的是您的视图将使用该组合执行的特殊功能。

我一直使用多个名称作为同一个函数,关键是:

def makerss(request, anystring=None, anynumber=None):

通过给出参数默认值,它允许您以不同的方式使用相同的功能。在这种情况下,当您只想传递anystring的值,或者anystringanynumber应该有值时,可以使用该函数。

我知道这有很多不同点,所以我会尝试将它们放在一起,这样你就可以看到它是如何工作的。要有两个url,一个捕获一个字符串并传递它,另一个捕获一个数字,一个斜杠,然后一个字符串,但都指向相同的视图函数,你可以使用它:

urlpatterns = patterns('',
    url(r'^rss/(?P<anystring>\w+)/$', 'rss.rssama.views.makerss', name='rss-anystring'),
    url(r'^rss/(?P<anynumber>\d+)/(?P<anystring>\w+)/$', 'rss.rssama.views.makerss', name='rss-number-string'),
    url(r'^$', 'rss.rssama.views.home'),    
)

使用这样的视图函数:

def makerss(request, anystring=None, anynumber=None):
    if anystring:
        if anynumber:
            #Do something with the string and the number
        else:
            #Do something with just the string

如果有帮助,请告诉我。此外,Django摇滚,所以很荣幸!

Python Regex Library Docs

答案 1 :(得分:1)

你真的不需要为此提供两个名称参数。我的意思是,你已经在regex中有变量名。实际问题是,你不能给出两个名字参数,所以你可以这样做:

url(r'^rss/(?P<anynumber>[^/]+)/(?P<anystring>[^/]+)/$', 'rss.rssama.views.makerss',name='something'),

编辑:

使用上面的urlConf,您可以创建相应的视图:

def makerss(request, anynumber, anystring):

答案 2 :(得分:0)

name2应该是什么? url函数采用name参数,这是您反转时的URL名称,但是您无法添加随机额外函数。

否则,您可以使用正确的语法将两个元素发送到视图。当然,既然你已经屏蔽了变量名而没有提供实际的错误或回溯,我们就无法知道出了什么问题。