2012-11-28 54 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

谢谢阿拉斯代尔。事实上,缺少命名组是有道理的... –