Django的管理员'改变'查看不接受kwargs = {' object_id':' blah}

时间:2012-11-28 16:18:56

标签: django django-admin

我有点被抛出。我有以下代码,效果非常好:

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源代码中查找答案,但找不到用于更改的视图,因此链接到相关模块也会非常有用!

2 个答案:

答案 0 :(得分:2)

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

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

您可以发现它将请求分派给change_view实例的ModelAdmin方法。 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})应该有用。

我不知道它是否打算避免一些边缘情况,或者它只是一个错误,并且已经有一张修复此问题的机票。我稍后会查看。

答案 1 :(得分:0)

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

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

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

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