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的用法,或者我误解了它所说的内容?@GregPalliskwargs
用法正常情况下与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),