2012-11-28 41 views
2

我有點被這個拋出。我有以下的代碼,它工作得很好:Django的管理員'更改'視圖不接受kwargs = {'object_id':'blah}

urlresolvers.reverse('admin:cards_card_change', args=([92])) 

爲了進一步我的理解,我想嘗試重寫路線爲:

urlresolvers.reverse('admin:cards_card_change', kwargs={'object_id':92}) 

如看似the documentation on reversing admin views建議(我使用Django 1.4)。

但是,這似乎不匹配任何東西。爲什麼不?我嘗試在django源代碼中尋找答案,但找不到用於更改的視圖,因此在那裏指向相關模塊的鏈接也會非常有用!

+0

雖然可以定義支持關鍵字參數的urlpatterns,但管理URL並非如此。顛倒管理員網址時,只支持位置(而不是關鍵字)參數。 –

回答

2

變化視圖的urlpattern改變它是在admin/options.py

url(r'^(.+)/$', 
    wrap(self.change_view), 
    name='%s_%s_change' % info), 

您可以發現它會向ModelAdmin實例的change_view方法發送請求。該change_view方法還在於admin/options.py

def change_view(self, request, object_id, form_url='', extra_context=None): 
    ... 

它接受一個參數object_id

reverse缺少比賽的原因是urlpattern以上不接受指定的參數,如果你把它更改爲類似

url(r'^(?P<object_id>.+)/$', 
    wrap(self.change_view), 
    name='%s_%s_change' % info), 

urlresolvers.reverse('admin:cards_card_change', kwargs={'object_id':92})應該工作。

我不知道這是否是爲了避免一些邊緣情況,或者它只是一個錯誤,並且已經有一張票正在解決這個問題。我稍後再檢查一次。

+0

真棒,謝謝 - 一個非常有用的答案。一個簡單的問題就是爲了確保我理解並且能夠在下一次得到這個答案 - 是否正確地假設文檔提供了kwargs的用法,或者我誤解了它的意思? –

+0

@GregPallis'kwargs'的用法和'args'的用法一樣。這裏'Admin'缺少名爲group的'kwargs'用法失敗。該文檔目前使用'args'用法,因此請保持這種狀態直到'kwargs'用法可用於反轉管理URL – okm

+0

@GregPallis似乎是一個錯誤。我已經爲此報告了[ticket](https://code.djangoproject.com/ticket/19406#ticket) – okm

0

我認爲這是一個python語法問題。 事情是**kwargs不能被視爲*args。 您試圖調用的函數具有第一個參數(object_id),它是位置型的,不能用作命名參數。 (有人告訴我,如果我錯了)

對你來說,object_id是一個位置參數,因此如果在kwargs

使用。如果你希望你的視圖功能也接受OBJECT_ID在kwargs將被忽略,你具有例如

my_id = kwargs.get('object_id', args[0]) 
+0

當調用視圖時,可以提供'object_id'作爲位置參數或關鍵字參數。按照你的建議,你不需要改變視圖。正如@okm在他們的回答中所說的那樣,問題在於,更改視圖不使用正則表達式中的命名組。 – Alasdair

+0

謝謝阿拉斯代爾。事實上,缺少命名組是有道理的... –