首页 > 解决方案 > 动态路径:确保 urlpatterns 是路径列表

问题描述

我有很多这样的通用模式:

urlpatterns = [
    path('json/ay/<int:pk>', AyView.as_view(), name='json_ay'),
    path('json/by/<int:pk>', ByView.as_view(), name='json_by'),
    ...
]

(当然,这些类并不简单Ay,或者By这是为了清楚起见),我试图将它们转换为这样的通用函数:

first_cap_re = re.compile('(.)([A-Z][a-z]+)')
all_cap_re = re.compile('([a-z0-9])([A-Z])')
def convert(name):
    s1 = first_cap_re.sub(r'\1_\2', name)
    return all_cap_re.sub(r'\1_\2', s1).lower()


def json_view(view_class):
    view_name = '_'.join(convert(view_class.__name__).split('_')[:-1])
    return path(f'json/{view_name}/<int:pk>', view_class.as_view(),
                name=f'json_{view_name}'),

然后这样称呼它:

urlpatterns = [
    json_view(AyView),
    json_view(ByView),
    ...
]

我收到此错误:

ERRORS:
?: (urls.E004) Your URL pattern (<URLPattern 'json/ay/<int:pk>' [name='json_ay']>,) 
    is invalid. Ensure that urlpatterns is a list of path() and/or re_path() instances.
    HINT: Try using path() instead of a tuple.

我不知道为什么,有什么想法吗?

标签: djangodjango-urls

解决方案


这只是 return 语句末尾的一个额外逗号导致它返回一个元组。去掉逗号。

return path(f'json/{view_name}/<int:pk>', view_class.as_view(),
            name=f'json_{view_name}')
                                   # ^

推荐阅读