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

2024-10-02 20:32:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我无法将多个变量发送到视图。

my urls.py如下:

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

视图.py

def maakrss(request, anything):

所以现在它从www.mydomain.com/rss/[anything]/获取并将“anything”发送到我的视图。不过,我也希望它将另一个字符串发送到views.py,例如:

www.mydomain.com/rss/[anynumber]/[anystring]/

我试过但没用:

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

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

所以我的问题是:如何才能从url中给出两个字符串?


Tags: namepycom视图urlwwwurlsviews
3条回答

name2应该是什么?url函数接受一个name参数,该参数是反向时URL的名称,但不能随机放置额外的函数。

否则,您就有了将两个元素发送到视图的正确语法。当然,由于您屏蔽了变量名,并且没有提供实际的错误或回溯,我们无法知道真正的错误是什么。

你不需要为此给出两个名称参数。我的意思是,在regex中已经有了变量名。实际问题是,不能给出两个name参数,因此可以改为:

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

编辑:

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

def makerss(request, anynumber, anystring):

首先,regex部分应该如下所示:

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

这些位于<...>部分中的字符串允许您为匹配的regex命名。然后Django将使用该名称将值传递给您的函数。因此,函数必须有一个同名的参数。在这种情况下,Django将获取名为anynumber的值,并将该值用于名为anynumber的函数参数。这同样适用于anystring,这个系统使您不必担心函数参数的顺序。

\d+将匹配一个或多个数字字符(数字)。最好将regex限制为只匹配数字(如果这是您要捕获的内容),而不是任何字符,并希望只显示数字。如果您想将数字部分限制为一定数量的数字,那么可以使用\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 %})中用作速记。因此,您已经拥有的名称“anything”指的是对视图函数的调用,向它传递一个恰好被调用anything的关键字参数。对于要传递两个字符串的情况,请指定一个类似“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

如果有帮助,请告诉我。还有,姜戈岩,真是太棒了!

Python Regex Library Docs

相关问题 更多 >