2013-09-27 73 views
2

我有兩種方法在視圖中創建和更新,其中更新需要一個參數,而創建不帶任何。我決定把它們變成只有一個函數update_create,因爲它們沒有那麼不同。django模板拋出NoReverseMatch錯誤

這是觀點新方法的樣子:

def update_create(request, id=None): 

這是我的urls.py:

url(r'^(\d+)/update/$|create/$', update_create, name='update_create'), 

這是我的模板的外觀模板/ list.html

<a href="{% url 'update_create' %}"> Create a new event </a> 

使用上述代碼時出現此錯誤:

NoReverseMatch at /agenda/list/ 
    Reverse for 'update_create' with arguments '()' and keyword arguments '{}' not found. 

但是,如果我用這個在我的模板,而不是(我增加了一個參數),它的工作沒有任何錯誤:

<a href="{% url 'update_create' 1 %}"> Create a new event </a> 

有人能解釋發生了什麼?爲什麼以前的代碼不起作用,以及爲什麼新代碼工作?

+0

順便說一句,你讀過這篇文章嗎? http://stackoverflow.com/questions/4981026/noreversematch-error –

+0

是的,我看到一些類似的話題,但我的更多的是爭論。謝謝:) – smarber

回答

2

URL模式(\d+)預計號碼作爲參數提供。要解決這個問題,只需提供這樣的網址:

url(r'^(\d+)/update/$', update_create, name='update_create'), 
url(r'^update/$', update_create, name='update_create'), 
+0

固定,我只是修改了一點我的urls.py使參數可選:url(r'^(\ d +)?/?update/$ | create/$',update_create,name ='update_create') ,現在它可以工作。謝謝你:) – smarber

+2

@smarber - 我會建議你服用mariodev的方法 - 有兩個單獨的URL來保持它的顯式。這更易於閱讀,並且易於調試。 – karthikr

+0

我只是儘量避免冗長,但這不應該使調試更加困難。我明白你的意思了,謝謝你的建議 – smarber

1

正如mariodev指出的,您的網址格局正期待着網址前面的數字。因此,您的第一個網址:

<a href="{% url 'update_create' %}"> Create a new event </a> 

會生成一個像/更新,這是不是一個有效的網址。但是,後者的網址:

<a href="{% url 'update_create' 1 %}"> Create a new event </a> 

會生成一個像/ 1 /更新,這是一個有效的網址。

從Django文檔:https://docs.djangoproject.com/en/dev/topics/http/urls/

基本上後面的參數解析得到的先到先得,並傳遞給你的看法。在開發時要考慮的另一件事是使用明確命名的參數,正如django文檔所闡述的那樣。