首先,正则表达式部分应如下所示:
r'^/rss/(?P<anynumber>\d+)/(?P<anystring>.+)/$'
<...> 部分中的那些字符串允许您为正则表达式匹配的任何内容命名。然后 Django 将使用该名称将值传递给您的函数。因此,您的函数必须有一个同名的参数。在这种情况下,Django 将采用名为anynumber 的值并将该值用于名为anynumber 的函数的参数。 anystring 也是如此,这个系统让您不必担心函数参数的顺序。
\d+ 将匹配一个或多个数字字符(数字)。如果这是您打算捕获的内容,最好将正则表达式限制为仅匹配数字,而不是任何字符,并希望只出现数字。如果您想将数字部分限制为特定位数,您可以使用\d{1,4} 取一到四位数字。
下一部分,(?P<anystring>.+) 将捕获由一个或多个任意字符组成的字符串。这实际上将匹配 'letters/moreletters' 之类的内容,包括斜线。 Python 正则表达式中有许多“特殊序列”可能会有所帮助。要仅匹配数字、字母和下划线字符,请使用\w,如(?P<anystring>\w+)。为了更宽松但忽略空格或任何其他废话,(?P<anystring>[a-zA-Z1-9:;_{}\[\]] 捕捉一大堆字符。确保转义任何可能是正则表达式中特殊字符的内容。但是,要保守。如果您允许太多选项,谁知道您以后必须解决什么样的错误。
现在转到url 函数的名称参数。该名称不是它将捕获的模式传递给您的函数的名称。它是视图函数的特定调用类的名称,可以在其他上下文中用作简写,例如模板标记{% url view-name arg1 arg2 %}。因此,您已经拥有的名称“anything”是指对您的视图函数的调用,并传递给它一个恰好被称为任何东西的关键字参数。对于您想要传递两个字符串的情况,请给它一个类似“rss-number-string”的名称来表示您想要采用的参数,或者一个名称是指您的视图将使用该组合执行的特殊功能。
我一直对同一个函数使用多个名称,关键是:
def makerss(request, anystring=None, anynumber=None):
通过为参数提供默认值,它允许您以不同的方式使用相同的功能。在这种情况下,当您只想为anystring 传递一个值,或者当anystring 和anynumber 应该有值时,可以使用该函数。
我知道这是很多不同的点,所以我会尝试将它们放在一起,以便您了解它是如何工作的。要有两个 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