2

我对此有点失望。我有以下代码,效果很好:

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

为了加深我的理解,我想尝试将这一行重写为:

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

正如有关反转管理视图的文档所建议的那样(我使用的是 Django 1.4)。

但是,这似乎根本不匹配任何东西。为什么不?我尝试在 django 源代码中查找答案,但找不到用于更改的视图,因此指向相关模块的链接也将非常有帮助!

4

2 回答 2

2

urlpattern更改视图位于admin /options.py中:

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

您会发现它向实例的change_view方法发送了一个请求。ModelAdminchange_view方法也位于admin/options.py中:

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

它确实接受一个参数object_id

The reason of the missing match of reverse is that the urlpattern above does not accept named parameter, if you change it to something like

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

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

I've no idea whether it was intended to avoid some edge cases or it's just a bug and there's already a ticket fixing this. I'll check it later.

于 2012-11-28T17:12:08.237 回答
0

我认为这是一个 python 语法问题。问题是**kwargs不能被视为*args。您尝试调用的函数具有第一个参数 ( object_id),它是位置参数,不能用作命名参数。(如果我错了,有人告诉我)

对你来说,object_id是一个位置参数,因此如果在 kwargs 中使用将被忽略

如果您希望您的视图函数也接受 kwargs 中的 object_id,则必须更改它,例如

my_id = kwargs.get('object_id', args[0])
于 2012-11-28T16:34:57.550 回答