具有父 url 参数的自定义 Django 管理站点

Posted

技术标签:

【中文标题】具有父 url 参数的自定义 Django 管理站点【英文标题】:Custom Django admin site with parent url parameter 【发布时间】:2011-11-07 18:15:50 【问题描述】:

我的 url 模式如下所示: (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)

这样我就不需要像索引这样的视图方法中的参数 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】:

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

    除非您尝试为自定义 ID 匹配空字符串(我猜您不是),否则您应该使用 + 而不是 *。 + 号应该放在括号之外。 如果您只是想匹配字母和数字,您的正则表达式可以简化为 [\w]+ 最后,如果您想要自定义 id 的命名参数,您必须在模式中包含名称。

所以最终,你的 url 模式应该是这样的:

(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)

【讨论】:

以上是关于具有父 url 参数的自定义 Django 管理站点的主要内容,如果未能解决你的问题,请参考以下文章

Django 1.8 没有使用我的自定义登录页面

django中的自定义登录URL

如何在 django 的自定义过滤器中使用 % url % 来显示主题标签

Django 中的自定义 url 模式

如何使用 django-filters 过滤 ModelViewSet 中的自定义 url

django admin changelist_view 中的自定义 html 字段