【问题标题】:Get name for matched URL pattern获取匹配的 URL 模式的名称
【发布时间】:2010-11-05 17:54:44
【问题描述】:

我正在编写一个 Django 上下文处理器,它需要访问成功解析请求的 URL 模式的名称。鉴于模式,

url(r'^home/$', 'app.index', name='website.home')

和请求路径/home,我想获取name的值,在本例中是website.home。

我从 djangosn-ps.org 获得了这段代码:

def _get_named_patterns():
    """ Returns a list of (pattern-name, pattern) tuples.
    """
    resolver = urlresolvers.get_resolver(None)
    patterns = sorted(
        (key, val[0][0][0]) for key, val in resolver.reverse_dict.iteritems() if isinstance(key, basestring))
    return patterns

我可以使用它来实现我的目标,但我的直觉告诉我必须有更好的方法。感谢您的帮助。

【问题讨论】:

标签: django django-urls


【解决方案1】:

通过请求对象和中间件来做呢?喜欢:

class MyMiddleware (object):
  def process_view (self, request, view_func, view_args, view_kwargs):
    if view_kwargs.get ('name', None):
      request.name = view_kwargs.get ('name', None)
    ret None

并在 settings.py 中使用默认的上下文预处理器:

"django.core.context_processors.request",

然后在执行完中间件之后,到处都可以通过request.name获取名称。

干杯,

【讨论】:

  • +1 这正是视图中间件的用途。如果您不喜欢将完整的请求对象填充到所有模板中,您仍然可以将视图中间件与您自己的上下文处理器配对,该处理器从请求对象中提取值并将其直接放入上下文中。
  • 我已尝试执行上述操作,但 view_kwargs 字典没有键“名称”。您确定 URL 名称最终出现在 dict 中吗?
  • 尝试将其重写为 dict: {'name': 'website.home'} in urls.py
  • 当然可以,但是我的所有观点都必须接受一个额外的论点。另外,恕我直言,这种做法违背了 DRY 的精神,因为我的 URL 模式看起来像: url(r'^home/$', 'app.index', {'name': 'website.home'}, name ='website.home') 我还需要 reverse('website.home') 才能工作。
猜你喜欢
  • 2021-09-28
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
  • 2021-05-13
  • 1970-01-01
  • 2017-11-02
相关资源
最近更新 更多