Django urls.py:将动态 url 参数传递给 include()

Django urls.py: passing dynamic url parameter into include()

我在 Django 文档 (https://docs.djangoproject.com/en/3.0/topics/http/urls/#passing-extra-options-to-include) 中发现我可以将任何常量传递到 include() 语句中。在文档的示例中,我们传递 blog_id=3.

from django.urls import include, path

urlpatterns = [
    path('blog/', include('inner'), {'blog_id': 3}),
]

但是如果我想将动态 url 参数传递给 include() 怎么办?我的意思是这样的:

from django.urls import include, path

urlpatterns = [
    path('blog/<int:blog_id>/', include('inner'), {'blog_id': ???}),
]

可能吗?

没有指定kwargs,所以你写:

from django.urls import include, path

urlpatterns = [
    # <i>no</i> { 'blog_id': … }
    path('blog/<b><int:blog_id></b>/', include('inner')),
]

url 参数将传递给包含的视图的 kwargs。

documentation on Including other URLconfs 在某种程度上讨论了这一点,它说:

(…) For example, consider this URLconf:

from django.urls import path
from . import views

urlpatterns = [
    path('<page_slug>-<page_id>/history/', views.history),
    path('<page_slug>-<page_id>/edit/', views.edit),
    path('<page_slug>-<page_id>/discuss/', views.discuss),
    path('<page_slug>-<page_id>/permissions/', views.permissions),
]

We can improve this by stating the common path prefix only once and grouping the suffixes that differ:

from django.urls import include, path
from . import views

urlpatterns = [
    path('<page_slug>-<page_id>/', include([
        path('history/', views.history),
        path('edit/', views.edit),
        path('discuss/', views.discuss),
        path('permissions/', views.permissions),
    ])),
]