URL Django 中的两种模式解析

URL resolution in Django with two patterns

需要为 Django 中的任务和子任务提供选项。其中示例任务是 abc_123 ,示例子任务是 xyz-987

example.com/abc_123/options
example.com/abc_123/xyz-987/options

我的urls.py文件

urlpatterns = [
    url(r'^/(?P<taskId>.+)/options$', views.AvailableOptions.as_view()),
    url(r'^/(?P<taskId>.+)/(?P<subtaskId>.+)/options$', views.AvailableOptions.as_view()),
]

只发送taskId时正常。发送任务和子任务 ID 时。该模式将 abc_123/xyz-987 作为 taskId。我需要 url 分别解析为 abc_123xyz-987 作为 taskId 和 subtaskId

你不应该匹配斜线,所以我们可以使用匹配除斜线以外的所有字符组,所以:

urlpatterns = [
    url(r'^/(?P<taskId><b>[^/]+</b>)/options$', views.AvailableOptions.as_view()),
    url(r'^/(?P<taskId><b>[^/]+</b>)/(?P<subtaskId><b>[^/]+</b>)/options$', views.AvailableOptions.as_view()),
]

然而,您可能希望将 path(…) [Django-doc]<str:…> 路径转换器一起使用,因此:

urlpatterns = [
    path('<<b>str:</b>taskId>/options/', views.AvailableOptions.as_view()),
    path('<<b>str:</b>taskId>/<<b>str:</b>subpathId>/options/', views.AvailableOptions.as_view()),
]