【问题标题】:How may I resolve python path strings with Django?如何使用 Django 解析 python 路径字符串?
【发布时间】:2012-02-08 21:06:45
【问题描述】:

我目前正在编写一个 Django 模板模板标签,我希望能够使用字符串引用其中的一个类,就像在 settings.MIDDLEWARE_CLASSES 中一样。标签看起来像{% mytag "myproject.lib.mymodule.SomeClass" %}

问题很简单:在我的模板标签中,如何轻松将此字符串解析为实际引用的类?

谢谢。

【问题讨论】:

  • 答案是“是”。现在。请编辑问题以询问您真正知道什么,即“如何将类名转换为类对象”。然后我们可以问“你为什么要这样做?”通常,您会更喜欢其他一些技术。请解释您的标签将如何处理名为参数的类对象。
  • 我很想看看这是怎么做到的,不管这是否是最好的做事方式
  • 谢谢。这个问题纯粹是技术性的,可能在很多地方都有用,不一定在模板标签中。但如果你好奇,目标是创建类似于Facebook's BigPipe 的东西。该标记将采用 Pagelet 类路径作为参数,将其注册以进行延迟渲染,最后在必要时返回占位符。

标签: python django


【解决方案1】:

如果您确实需要导入指定为字符串的包,则需要查看__import__ function

基本用法是可以尝试导入字符串中指定的包如

my_class = __import__("myproject.lib.mymodule.SomeClass")

相当于

import myproject.lib.mymodule.SomeClass as my_class

但是,正如 S.Lott 所提到的,您需要仔细考虑这是否真的是解决问题的最佳方法。

【讨论】:

  • 谢谢!我考虑了许多其他选择,但这一个似乎确实是最灵活的。
  • 只是补充一点,该解决方案实际上并没有按原样工作,我需要一点 rsplit 魔法,以及 __import__ 函数的 fromlist 参数。我实际上阅读了this question 以找到正确的答案。
【解决方案2】:

Django 有一些实用函数来处理这种情况。

在 Django 1.7 或更高版本中,使用django.utils.module_loading.import_string 函数。

在 Django 1.6 中,使用django.utils.module_loading.import_by_path 函数。

(看起来import_by_path 也存在于 1.5 中,尽管没有记录)

示例用法:

from django.utils.module_loading import import_string

my_class = import_string('myproject.lib.mymodule.SomeClass')

【讨论】:

    猜你喜欢
    • 2015-01-24
    • 2018-10-15
    • 2011-07-14
    • 1970-01-01
    • 2020-07-30
    • 2020-05-18
    • 2023-01-04
    • 1970-01-01
    • 2010-12-11
    相关资源
    最近更新 更多