我在向视图发送多个变量时遇到了一些麻烦.
我的urls.py如下:
urlpatterns = patterns('',
url(r'^rss/(?P<anything>[^/]+)/$', 'rss.rssama.views.makerss', name='anything'),
url(r'^$', 'rss.rssama.views.home'),
)
Run Code Online (Sandbox Code Playgroud)
views.py
def maakrss(request, anything):
Run Code Online (Sandbox Code Playgroud)
现在需要www.mydomain.com/rss/[anything]/并向我的视图发送"任何内容".但是我也希望它将另一个字符串发送到views.py,如:
www.mydomain.com/rss/[anynumber]/[anystring]/
我试过这个,但是没有用:
url(r'^rss/(?P<anynumber>[^/]+)/(?P<anystring>[^/]+)/$', 'rss.rssama.views.makerss', name='anynumber', name2='anystring'),
Run Code Online (Sandbox Code Playgroud)
但这不起作用,它给出了这个错误:重复关键字参数(urls.py,第17行)
所以我的问题是:如何让它从网址中提取两个字符串?
Kev*_*ard 28
首先,正则表达式部分应如下所示:
r'^/rss/(?P<anynumber>\d+)/(?P<anystring>.+)/$'
Run Code Online (Sandbox Code Playgroud)
<...>部件内的这些字符串允许您为正则表达式匹配的任何内容命名.然后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函数的name参数.该名称不是它将捕获的模式传递给您的函数.它是视图函数调用的特定类的名称,可以在其他上下文中用作模板标记的简写{% url view-name arg1 arg2 %}.所以,你已经拥有的名称,"任何东西",指的是对你的视图函数的调用,传递一个恰好被称为任何东西的关键字参数.对于要传递两个字符串的情况,请为其指定一个名称,例如"rss-number-string"以表示您要采用的参数,或者指定一个名称,该名称指的是您的视图将使用该组合执行的特殊功能.
我一直使用多个名称作为同一个函数,关键是:
def makerss(request, anystring=None, anynumber=None):
Run Code Online (Sandbox Code Playgroud)
通过给出参数默认值,它允许您以不同的方式使用相同的功能.在这种情况下,当您只想为值传递值时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'),
)
Run Code Online (Sandbox Code Playgroud)
使用这样的视图函数:
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
Run Code Online (Sandbox Code Playgroud)
请让我知道这可不可以帮你.此外,Django摇滚,所以很荣幸!
| 归档时间: |
|
| 查看次数: |
19124 次 |
| 最近记录: |