【问题标题】:Django: cannot import name 'url_patterns'Django:无法导入名称“url_patterns”
【发布时间】:2018-06-21 13:51:33
【问题描述】:

我有一个奇怪的边缘情况,我需要在视图中使用存储在 urls.py 中的数据,但是由于 urls.py 文件导入视图,当我尝试导入时出现循环导入错误url 数据到视图中。

cannot import name 'url_patterns'

Django 是否有任何方法可以在一个可以规避此错误的视图中获取所有 url 模式? reverse() 函数存在的事实表明它可能存在。

【问题讨论】:

  • 视图导入url?不能本地导入吗?
  • 你能解释一下“本地导入”是什么意思吗?

标签: django django-urls


【解决方案1】:

您通常可以通过在视图中本地导入urls 来解决这个问题(这取决于一点)。喜欢:

# urls.py

import someapp.views

url_patterns = [
    url('some_url/', someapp.views.some_view),
]

然后在视图中导入 url,如:

# views.py

def some_view(request):
    from someapp.urls import url_patterns
    # ...
    # do something with urlpatterns
    # return response
    pass

因此,我们在这里推迟在视图中导入urls.py,直到实际调用视图函数。到那时,views.pyurls.py 都(通常)已经加载了。但是,您不能调用直接在 views.py 中的视图,因为这样会在加载 urls.py 之前完成导入。

请注意,通常你不必必须导入url_patterns,你可以使用reverse(..)等来获取对应于视图函数的URL(甚至将参数传递到字典中, ETC。)。所以我真的建议寻找 Django 工具来处理 URL。

【讨论】:

  • 啊,好的,对。通常这确实有效,但这是我尝试的第一件事,在这种特殊情况下,它会导致相同的错误。此外,在这种情况下,使用反向不起作用,因为我试图将 url 列表输出到一个动态生成的 javascript 文件,该文件需要有自己的 url 模式记录。
【解决方案2】:

找到答案:

from django.urls import get_resolver
url_patterns = set(v[1] for k,v in get_resolver(None).reverse_dict.items())

【讨论】:

    猜你喜欢
    • 2011-07-11
    • 2015-03-01
    • 2011-12-27
    • 2018-05-29
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多