2009-12-03 77 views
55

捕獲的異常而呈現:反向爲「*」與參數「()」和關鍵字參數「{}」未找到

Reverse for 'products.views.'filter_by_led' with arguments '()' and keyword arguments '{}' not found.

我是能夠成功地導入從外殼products.views.filter_by_led和它的工作等等路徑應該是正確的。

這裏是urls.py:

(r'^led-tv/$', filter_by_led), 

這是正在生成的錯誤:

href="{% url products.views.filter_by_led %}"> 

對此我無法理解,因爲這工作得很好,從相同的文件:

{% url products.views.lcd_screen_size screen_size=50 %} 

以下是函數定義:

def filter_by_led(request): 

我不明白爲什麼Django會認爲該函數無法找到該函數的Reverse。

我刪除了所有*.pyc文件並重新啓動Apache。

我在做什麼錯?

+0

你能同時顯示lcd_screen_size和filter_by_led url定義嗎? – 2009-12-03 19:56:45

+1

因爲在shell中反向工作......這可能是導致問題的其他內容。我已經得到了一些很奇怪的反向錯誤,這似乎是任何不良的URL定義任何地方在你的項目可以搞砸整個事情:/ – Jiaaro 2009-12-04 00:10:33

回答

51

有3兩件事我能想到把我的頭頂部:

  1. 只是用named urls,它更強大和維護反正
  2. 嘗試在一個命令行中使用django.core.urlresolvers.reverse(可能)更好的錯誤

    >>> from django.core.urlresolvers import reverse 
    >>> reverse('products.views.filter_by_led') 
    
  3. 檢查,看看,如果你有多個URL指向該視圖

+0

反向似乎工作正常從外殼: >>> from django.core .urlresolvers進口反向 >>> reverse('products.views.filter_by_led') '/ reviews/led /' – BryanWheelock 2009-12-03 22:31:19

+1

我也嘗試使用名稱網址和我得到了相同類型的錯誤:捕獲異常,同時呈現:反向找不到參數'()'和關鍵字參數'{}'的'ledtvfilter'。 – BryanWheelock 2009-12-03 22:46:13

+0

如果在shell中反向工作,那麼這可能不是什麼導致錯誤 – Jiaaro 2009-12-04 00:07:49

0

我不認爲你需要URL條目中的尾部斜線。即,代之以:

(r'^led-tv$', filter_by_led), 

這是假設您已啓用trailing slashes,這是默認值。

+1

它應該沒關係,但是如果你想在url中使用尾部斜線,它應該在那裏(我所有的'urls.py'文件都有斜線) – Jiaaro 2009-12-03 21:12:28

35

殼牌調用反向(如上所述)都非常好調試這些問題,但有兩個關鍵條件:

  • 必須提供參數,無論爭論的觀點需要相匹配,
  • 這些論據必須匹配正則表達式模式。

是的,這是合乎邏輯的。是的,這也是令人困惑的,因爲反向只會拋出異常,不會給你任何進一步的提示。

URL模式的一個例子:

url(r'^cookies/(?P<hostname>[^/]+)/(?P<url_id>\d+)/$', 'register_site.views.show_cookies', name='show_cookies'), 

然後在外殼會發生什麼:

>>> from register_site.views import show_cookies 
>>> reverse(show_cookies) 
NoReverseMatch: Reverse for 'register_site.views.show_cookies' with arguments '()' and keyword arguments '{}' not found. 

,因爲我提供的任何參數它不工作。

>>> reverse('show_cookies', kwargs={'url_id':123,'hostname': 'aaa'}) 
'/cookies/aaa/123' 

現在的工作,但...

>>> reverse('show_cookies', kwargs={'url_id':'x','hostname': 'www.dupa.com'}) 
NoReverseMatch: Reverse for 'show_cookies' with arguments '()' and keyword arguments '{'url_id': 'x', 'hostname': 'www.dupa.com'}' not found. 

現在沒有工作,因爲url_id不匹配的正則表達式(預期數值,提供的字符串)。

您可以使用反向同時使用位置參數和關鍵字參數。語法是:

reverse(viewname, urlconf=None, args=None, kwargs=None, prefix=None, current_app=None) 

,因爲它涉及到網址模板標籤,有關於它的有趣的事情。 Django的documentation給人例如使用引用視圖名稱:

{% url 'news.views.year_archive' yearvar %}

所以我把它用在一個類似的方式在我的HTML模板:

{% url 'show_cookies' hostname=u.hostname url_id=u.pk %}

但這並沒有爲我工作。但異常消息給我的可能是錯誤的暗示 - 注意周圍視圖名稱雙單引號:

Reverse for ''show_cookies'' with arguments...

它開始時,我刪除引號工作:

{% url show_cookies hostname=u.hostname url_id=u.pk %}

而且這混淆。

+1

我使用了一個url(r'^ candidate- verifymobile/$,views.VerifyMobile.as_view(),名稱='驗證移動'),但仍然當我使用相反,它給出了同樣的錯誤,在這種情況下,我沒有在URL中的任何關鍵字參數。 – 2015-05-25 06:02:28

+0

在有些情況下,我會有一個參數,其他時間我不會,我需要在我的** urls.py **中創建兩個單獨的視圖函數和兩個單獨的url嗎?使用你的例子想象有時'u.pk'是其他時間的數字,它是None。但在你的模板中,你正在使用'{%url'show_cookies'url_id = u.pk%}''。我嘗試添加'{%if u.pk == None%}顯示錯誤消息{%else%} {%url'show_cookies'url_id = u.pk%} {%endif%}'但我仍然收到NoReverseMatch異常。 – Deven 2018-02-23 17:57:40

11

您需要周圍的視圖名稱單引號

{% url 'viewname' %} 

,而不是

{% url viewname %} 
+0

這是有幫助的! – Anupam 2018-02-22 06:36:54

4

我也有類似的問題和解決方案,是朝着正確使用「$」的(結束-string)性格:

我的主要url.py這個樣子(注意$符號):

urlpatterns = [ 
url(r'^admin/', include(admin.site.urls)), 
url(r'^$', include('card_purchase.urls')), 
] 

和我爲我的card_purchases應用url.py說:

urlpatterns = [ 
url(r'^$', views.index, name='index'), 
url(r'^purchase/$', views.purchase_detail, name='purchase') 
] 

我用 '$' 兩次。所以一個簡單的改變工作:

urlpatterns = [ 
url(r'^admin/', include(admin.site.urls)), 
url(r'^cp/', include('card_purchase.urls')), 
] 

注意第二個網址的變化!我的網址。py爲我的card_purchases應用程序看起來像這樣:

urlpatterns = [ 
url(r'^$', views.index, name='index'), 
url(r'^purchase/$', views.purchase_detail, name='purchase') 
] 

除此之外,我可以確認引號周圍命名的網址是至關重要的!

+0

非常感謝。花了一個小時來調試問題。你的解決方案正是我所缺少的。 – v01d 2015-12-22 12:25:31

0
{% url 'polls:create' poll.id %} 
0

在情況下,它可以幫助別人,我也有類似的問題和錯誤是由於兩個原因:

  1. 不使用應用程序的命名空間URL名稱

    {% url 'app_name:url_name' %} 
    
  2. URL名稱周圍缺少單引號(正如查理指出的here

相關問題