2011-05-28 28 views
7

我在向視圖發送多個變量時遇到了一些問題。在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/[anynumber]/[anystring]/

我試過,但沒有奏效:

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

但是,這並不工作,它給這個錯誤:關鍵字參數重複(urls.py,第17行)

所以我的問題:我怎樣才能使其沿兩個字符串給從網址?

回答

26

首先,正則表達式的部分應該是這樣的:

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 %}。所以,你已經有的名字,「任何東西」,都是指你的視圖函數的調用,並傳遞一個關鍵字參數,這個參數恰好被稱爲任何東西。對於想要傳遞兩個字符串的情況,請爲其指定一個名稱,例如「rss-number-string」來表示要採用的參數,或者是指您的視圖將使用該組合執行的特殊功能的名稱。

我用多個名字相同功能的時候,關鍵是這樣的:

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

通過給參數的默認值,它可以讓你使用相同的函數以不同的方式。在這種情況下,當您只想傳遞anystring的值時,或anystringanynumber應具有值時,可以使用此功能。

我知道這是很多不同的觀點,所以我會盡量將它們放在一起,以便了解它是如何工作的。有兩個網址,其中一個捉一個字符串並將其傳遞,而另一個捕獲一個數字,一個斜線,然後一個字符串,但都指向同一個視圖功能,您可以使用此:

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

凱文,非常感謝您的詳細解釋!真的很欣賞你花時間徹底解釋事物!它現在就像一種魅力!附:在考慮了很長時間學習什麼(PHP和一些框架或Django,我擁有基本的PHP技能和Python技能)之後,我決定與Django一起去,因爲我非常喜歡python。即使你一開始需要學習很多東西,我至今仍然非常喜歡它! – Javaaaa 2011-05-29 22:38:48

+0

不客氣。我會很高興在您發佈的任何其他問題上盡我所能。 – 2011-05-30 00:25:35

1

你並不需要爲此提供兩個名稱參數。我的意思是,你已經有了正則表達式中的變量名。實際的問題是,你不能給兩名參數,這樣就可以做到這一點,而不是:

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

編輯:使用URL配置上面,你可以創建相應的視圖

爲:

def makerss(request, anynumber, anystring): 
+0

以及如何在視圖中訪問這兩個變量呢?我現在得到錯誤:函數...當我使用[0]獲取anynumber內容時,得到了一個意外的關鍵字參數'anynumber'。 – Javaaaa 2011-05-28 22:25:06

+0

什麼?你真的需要閱讀文檔。 '東西'沒有傳遞給視圖,'anynumber'和'anystring'是。 – 2011-05-29 07:04:53

+0

我編輯了帖子 – Hgeg 2011-05-29 08:20:01

0

什麼是name2應該是? url函數需要一個name參數,該參數是您反轉URL時的名稱,但不能放置隨機附加函數。

否則,您擁有將兩個元素髮送到視圖的正確語法。當然,由於您已經屏蔽了變量名稱而沒有提供實際的錯誤或追溯,所以我們無法知道真正發生了什麼問題。