【问题标题】:Django: Get generic view class from url nameDjango:从 url 名称获取通用视图类
【发布时间】:2020-12-09 22:49:59
【问题描述】:

从 url 名称获取通用视图类的推荐方法是什么?

url(r'^$', HomeView.as_view(), name='home')

所以对于“home”,我想获得 HomeView 类。

【问题讨论】:

  • 您可能想反过来:从视图类的名称到 url 名称。为什么?因为类名是更高度结构化的世界。例如,在输入错误后,如果违规行包含的名称无法在此处解析,您将收到更有意义的错误消息。 (对于基于类的视图,您可以创建一个应用 .as_view() 的助手,以使解析和表示法更简单。)

标签: django


【解决方案1】:

Django 1.9 为 as_view() 返回的函数引入了 2 个属性。 view_initkwargsview_class

将此与泡菜的回答结合起来:

from django.urls import reverse, resolve

url = reverse('home')
view = resolve(url).func.view_class

【讨论】:

  • @IceFire,我在示例中添加了导入。
【解决方案2】:

我从以下问题得到的 get_class:Does python have an equivalent to Java Class.forName()?

url = reverse('home')
resolver_match = resolve(url)
func = resolver_match.func
module = func.__module__
view_name = func.__name__

clss = get_class( '{0}.{1}'.format( module, view_name ) )

这是我自己想出的,我非常愿意接受其他答案。

【讨论】:

  • 我还没有找到更好的东西,但它并不完全令人满意,因为它不完全是从其名称中获取视图。当上述 url 需要额外的参数(例如 id)时,名称不足以执行对 reverse 的调用。
【解决方案3】:

受 Pickels 回答的启发:

import importlib 
from django.core.urlresolvers import reverse, resolve

view_name = 'my_view_name'

view_func = resolve(reverse(view_name)).func
module = importlib.import_module(view_func.__module__)
view = getattr(module, view_func.__name__)

【讨论】:

    猜你喜欢
    • 2021-11-21
    • 2018-01-10
    • 2010-10-13
    • 1970-01-01
    • 2018-04-13
    • 2012-01-04
    • 2014-07-03
    • 1970-01-01
    相关资源
    最近更新 更多