首页 > 解决方案 > 如何从 django 请求中获取 urlpattern

问题描述

例如:

from django.urls import include, path

urlpatterns = [
    path('index/', views.index, name='main-view'),
    path('bio/<username>/', views.bio, name='bio'),
    path('articles/<slug:title>/', views.article, name='article-detail'),
    path('articles/<slug:title>/<int:section>/', views.section, name='article-section'),
    path('weblog/', include('blog.urls')),
    ...
]

我想'articles/<slug:title>/'从请求中获取字符串,而不是 title var 的值。

我使用 Django 1.8.2

标签: pythondjango

解决方案


如果你想要只是真实的path,你可以使用request.path. 文档

如果你想要<slug:title>参数,你只需像这样进入你的view函数。function arguments

def some_view(request, title):
    # do your job.

编辑

你需要这两个功能。

from django.urls import resolve, get_resolver, URLResolver, URLPattern


def get_view_name_by_path(path):
    result = resolve(path=path)
    return result.view_name


def find_url_pattern_by_name(name):
    if name is None:
        return None

    def deep_find(rs):
        for r in rs.url_patterns:
            if isinstance(r, URLResolver):
                result = deep_find(r)
                if result is not None:
                    return result
            elif isinstance(r, URLPattern):
                if r.name == name:
                    return r.pattern

    return deep_find(get_resolver())

你必须name在你的url pattern

urlpatterns = [
    ...
    path('articles/<slug:title>', your_view, name='your_view_name'),
    ...
]

最后,您可以在视图中看到您的模式。

def your_view(request, title):
    view_name = get_view_name_by_path(request.path)
    pattern = find_url_pattern_by_name(view_name)
    ...

推荐阅读