【问题标题】:Getting two strings in variable from URL in Django从 Django 中的 URL 获取变量中的两个字符串
【发布时间】:2011-09-04 02:32:42
【问题描述】:

我在将多个变量发送到视图时遇到了一些问题。

我的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/[anynumber]/[anystring]/

我试过了,但没用:

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

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

所以我的问题是:如何让它从 url 中提供两个字符串?

【问题讨论】:

    标签: python django url


    【解决方案1】:

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

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

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

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

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

    现在转到url 函数的名称参数。该名称不是它将捕获的模式传递给您的函数的名称。它是视图函数的特定调用类的名称,可以在其他上下文中用作简写,例如模板标记{% url view-name arg1 arg2 %}。因此,您已经拥有的名称“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
    

    如果这有帮助,请告诉我。另外,Django 摇滚,太棒了!

    Python Regex Library Docs

    【讨论】:

    • 凯文,非常感谢您的详尽解释!非常感谢您花时间彻底解释事情!它现在就像一个魅力! p.s.在考虑了很长时间学习什么(PHP 和一些框架或 Django,我有基本的 php 技能和 python 技能)之后,我决定使用 Django,因为我非常喜欢 python。尽管一开始你必须学习很多东西,但到目前为止我真的很喜欢它!
    • 不客气。我很乐意尽我所能解决您发布的任何问题。
    【解决方案2】:

    您实际上不需要为此提供两个名称参数。我的意思是,您已经在正则表达式中有变量名。实际的问题是,您不能提供两个名称参数,因此您可以这样做:

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

    编辑:

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

    def makerss(request, anynumber, anystring):
    

    【讨论】:

    • 那么我如何在视图中访问这两个变量呢?我现在得到错误:function ... got an unexpected keyword argument 'anynumber' 当我使用 something[0] 来获取 anynumber 内容时。
    • 什么?你真的需要阅读文档。 'something' 没有传递给视图,'anynumber' 和 'anystring' 是。
    【解决方案3】:

    name2 应该是什么? url函数带了一个name参数,就是逆向时的URL名称,但是不能放随机的额外函数。

    否则,您可以使用正确的语法将两个元素发送到视图。当然,由于您掩盖了变量名称并且没有提供实际的错误或回溯,我们无法知道到底出了什么问题。

    【讨论】:

      猜你喜欢
      • 2021-05-17
      • 2011-03-09
      • 2012-03-17
      • 2019-01-31
      • 2018-08-23
      • 1970-01-01
      • 2013-03-17
      • 2012-03-24
      • 1970-01-01
      相关资源
      最近更新 更多