Django';s管理员';改变';视图不接受kwargs={';对象id';:';blah}

Django';s管理员';改变';视图不接受kwargs={';对象id';:';blah},django,django-admin,Django,Django Admin,我有点被这个搞糊涂了。我有以下代码,它工作得非常好: urlresolvers.reverse('admin:cards_card_change', args=([92])) 为了加深我的理解,我想试着将这句话改写为: urlresolvers.reverse('admin:cards_card_change', kwargs={'object_id':92}) 正如(我使用的是Django 1.4)所建议的那样 然而,这似乎与任何东西都不匹配。为什么不呢?我试着在django源代码中寻找答

我有点被这个搞糊涂了。我有以下代码,它工作得非常好:

urlresolvers.reverse('admin:cards_card_change', args=([92]))
为了加深我的理解,我想试着将这句话改写为:

urlresolvers.reverse('admin:cards_card_change', kwargs={'object_id':92})
正如(我使用的是Django 1.4)所建议的那样


然而,这似乎与任何东西都不匹配。为什么不呢?我试着在django源代码中寻找答案,但找不到用于更改的视图,因此指向相关模块的链接也会非常有用

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

对于您来说,
object\u id
是一个位置参数,因此如果在kwargs中使用,它将被忽略

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

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

更改视图的
urlpattern
位于:

您可以发现它向
ModelAdmin
实例的
change\u视图
方法发送请求。
change\u视图
方法还存在于:

它确实接受一个参数
对象\u id

reverse
缺少匹配的原因是上面的
urlpattern
不接受命名参数,如果您将其更改为

url(r'^(?P<object_id>.+)/$',
    wrap(self.change_view),
    name='%s_%s_change' % info),
url(r'^(?P.+)/$”,
包装(自我更改视图),
名称=“%s\u%s\u更改“%info”),
urlsolvers.reverse('admin:cards\u card\u change',kwargs={'object\u id':92})
应该可以工作


我不知道这是为了避免一些边缘案例,还是仅仅是一个bug,而且已经有一张罚单来修复它了。我稍后会检查。

调用视图时,
object\u id
可以作为位置参数或关键字参数提供。您不需要按照建议更改视图。正如@okm在他们的回答中所说,问题在于change视图在正则表达式中没有使用命名组。太棒了,谢谢-这是一个非常有用的答案。一个简短的问题,只是为了确保我理解,并且下次能够正确地回答这个问题-我是否正确地假设文档中暗示了kwargs的用法,或者我误解了它所说的内容?@GregPallis
kwargs
用法正常情况下与
args
用法一样有效。此处
Admin
缺少的命名组使
kwargs
使用失败。文档当前使用的是
args
用法,因此请保留该文档,直到
kwargs
用法在管理员中可用URLs@GregPallis好像是个虫子。我已经为此做了报告。看起来@GregPallis报告的ticket已暂停,Django维护人员的评论表明,管理员URL始终只接受位置参数。因此,这个问题的答案似乎是:“当反转管理员URL时,只支持位置(而不是关键字)参数。”虽然可以定义支持关键字参数的
urlpatterns
,但管理员URL的情况并非如此。反转管理员URL时,只支持位置(而不支持关键字)参数。
def change_view(self, request, object_id, form_url='', extra_context=None):
    ...
url(r'^(?P<object_id>.+)/$',
    wrap(self.change_view),
    name='%s_%s_change' % info),