【问题标题】:Cannot import views in Django (2.1.4, Python 3.7.0, Win 7)无法在 Django 中导入视图(2.1.4、Python 3.7.0、Win 7)
【发布时间】:2023-04-03 18:35:01
【问题描述】:

我正在使用 django 构建一个站点,但无法将视图导入我的 URL 文件。

我的网址文件:

from django.contrib import admin
from django.urls import path
from django.conf.urls import include
from . import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('blog.urls')),
]

错误:ImportError: cannot import name 'views' from 'blog' (..\blog\blog__init__.py)

如果我尝试“从博客导入视图”,我会得到同样的错误。

如果我尝试“从 blogapp 导入视图”(blogapp 是博客文件夹中的应用程序名称),我会得到:

RecursionError: maximum recursion depth exceeded while calling a Python object.

基本上,它在 check_resolver (django\core\checks\urls.py) 的第 23 行和 check_resolver (django\urls\resolvers.py) 的第 397 行之间来回跳动。

如果我只尝试:“import views”,我会得到“ModuleNotFoundError: No module named 'views'”

我的项目结构: 主目录为“blog”,包含两个文件夹(blog 和 blogapp)以及 db.sqlite3 和 manage.py 文件。

子文件夹 blog 包含 pycache 文件夹,以及这些文件:init.py、settings.py、urls.py、wsgi.py。

子文件夹 blogapp 包含 pycache 文件夹迁移文件夹,以及这些文件:init.py、admin.py、apps.py、models.py、tests.py、views .py.

blog 和 blogapp 都在我的 settings.py 中的 INSTALLED_APPS 中。

我检查了几个类似名称的问题(及其建议的答案),但无法弄清楚出了什么问题。

【问题讨论】:

    标签: python django


    【解决方案1】:

    首先将您的项目文件夹重命名为不同于应用程序文件夹的名称,例如 blog-project。那么你应该有一个更新的树如下:

    博客项目
    -blog(此文件夹中的 settings.py、urls.py 和 wsgi.py)
    --urls.py(参见我的示例 1)
    -博客应用程序
    --模板
    ---博客应用
    ----blogapp_home.html
    ----index.html
    --urls.py(在此文件中,您可以从 .import 视图执行此操作)

    当您导航到主页时,Django 从您的根 urls.py 中读取。由于您将起点设置为:

    
    path('', include('blogapp.urls')),
    

    然后它会从您创建的新应用程序 blogapp 加载 urls.py。从 blogapp 文件夹中的 urls.py 导入您的视图。

    
    # Example 1 blog-project/blog/urls.py
    
    from django.contrib import admin
    from django.urls import path, include
    from blogapp import views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('', views.index, name='home'),
        path('blogapp/', include('blogapp.urls')),
    ]
    
    # Example 2 blog-project/blogapp/urls.py
    
    from django.urls import path, include
    from . import views
    
    urlpatterns = [
    
        path('', views.blogapphome, name='blogapp-home'),
    
    ]
    
    # Example 2 Views blog-project/blogapp/views.py
    
    from django.shortcuts import render
    
    def index(request):
        sometext = 'More Text'
        context = {'text': sometext}
    
        return render(request, 'blogapp/index.html', context)
    
    def blogapphome(request):
        sometext = 'Some Text Here'
        context = {'text': sometext}
    
        return render(request, 'blogapp/blogapp_home.html', context)
    
    # blog-project/blog/settings.py
    
    INSTALLED_APPS = [
        'blogapp.apps.BlogappConfig',
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
    ]
    
    
    

    【讨论】:

    • 这可行,虽然我有点困惑为什么我们有两个 url 文件,但似乎只有一个会更干净?
    • 当你创建一个项目时,你从一个 ROOT url.py 开始,可以这么说,这真的只是让你开始。它是指向应用程序 urls.py 的入口点。由于 Django 中应用程序的即插即用功能,它实际上更干净。假设您想在您的项目或您之前创建的项目中实现其他人的应用程序。如果该应用程序的所有 urls 路由都在 urls.py 文件中,这将是一个简单的集成。随着您更多地使用 Django,您的项目将有多个应用程序。每个都有自己的 urls.py。
    • 随着您深入了解 Django,您将真正开始欣赏它的组织性和简单性。就像其他任何事情一样,在您完成多个项目后,您就会开始看到联系。
    猜你喜欢
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    • 2020-06-16
    • 2020-11-24
    • 2017-08-04
    • 2023-03-19
    • 2012-05-22
    • 2020-08-14
    相关资源
    最近更新 更多