自定义Django管理站点与父url参数

时间:2011-08-31 16:00:17

标签: django url design-patterns admin reverse

我的网址模式如下:     (r'^ fb / custom /(?P [a-zA-Z0-9 +] *)/ admin /',include(custom_admin_site.urls)),

我覆盖了管理网站的admin_view方法:

def admin_view(self, view, cacheable=False):
    def inner(request, *args, **kwargs):
        if kwargs.has_key('custom_id'):
            request.custom_id = kwargs.pop('custom_id')
        return view(request, *args, **kwargs)
    if not cacheable:
        inner = never_cache(inner)
    # We add csrf_protect here so this function can be used as a utility
    # function for any view, without having to repeat 'csrf_protect'.
    if not getattr(view, 'csrf_exempt', False):
        inner = csrf_protect(inner)
    return update_wrapper(inner, view)

这样我在视图方法(如index)中不需要参数custom_id。我的问题是我不能使用urlresolvers.reverse('custom-admin:index')。 如果我在没有参数的情况下使用它,我会收到此错误:

Page not found. Request URL:    http://localhost:8000/fb/custom/(?P%3Ccustom_id%3E[a-zA-Z0-9%5C+]*)/admin/

好吧,不要惊讶。我没有提供参数custom_id。但是有了参数,我得到了这个错误:

reverse() got an unexpected keyword argument 'custom_id'

任何想法如何解决这个问题。我真的想使用反向查找。 url模板标记也存在同样的问题。

1 个答案:

答案 0 :(得分:0)

您的网址格式存在一些问题:

  1. 除非您尝试将空字符串与自定义ID匹配(我猜您不是),否则应使用+而不是*。
  2. +号应该超出括号。
  3. 如果您只是想匹配字母和数字,您的正则表达式可以简化为[\ w] +
  4. 最后,如果您想要自定义ID的命名参数,则必须在模式中包含该名称。
  5. 所以最终,你的网址模式应如下所示:

    (r'^fb/custom/(?P<custom_id>[\w]+)/admin/', include(custom_admin_site.urls)),
    

    现在我不确定你是如何调用urlresolvers.reverse的,但是如果你需要传递args或kwargs,它应该看起来像其中之一:

    urlresolvers.reverse('custom-admin:index', args=[custom_id])
    

    或对于kwargs,例如上面包含的模式:

    urlresolvers.reverse('custom-admin:index', kwargs={'custom_id':custom_id})