尝试几种方式从模块中导入函数失败

在学习使用Django来创建一个“学习笔记”网页时遇到了从模块导入函数失败的问题,尝试了几种方式都出现报错,不知是哪里出现问题,希望可以得到前辈指点。
问题:我需要将模块 models.py 中函数 Topic 导入到模块 views.py 中, 但是运行脚本之后会报错,报错指出问题出现在导入 Topic 上,所以我尝试了不同的方法导入,但都没有成功。

models.py

class Topic(models.Model):
    '''用户学习的主题'''
    text = models.CharField(max_length = 200)
    date_added = models.DateTimeField(auto_now_add = True)
    def __str__(self):
        '''返回模型的字符串表示'''
        return self.text

views.py

from django.shortcuts import render
# from sys import path
# path.append(r'D:/pycharm/Web应用程序/Learning Log/learning_logs')
from .models import Topic

models.py 和 views.py 在同一目录下

  1. 使用代码 from .models import Topic 来导入,出现如下报错
    from .models import Topic
    ImportError: attempted relative import with no known parent package
    同样的报错:
  2. 使用代码 from models import Topic 导入同目录下的模块,出现如下报错
  3. 准备用绝对路径导入来解决问题,但也出现了同样的报错
    from sys import path
    path.append(r'D:/pycharm/Web应用程序/Learning Log/learning_logs')
    from models import Topic
    raise ImproperlyConfigured(
    django.core.exceptions.ImproperlyConfigured: Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
    
python版本3.7,Django版本3.0.6
请教一下哪一部分出了问题呢?
十分感谢
Jason990420
最佳答案

In learning_log:

@settings.py

INSTALLED_APPS = [
    'learning_logs.apps.LearningLogsConfig',     # 新增行, 才能连结到 learning_logs
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

In learning_logs:

@admin.py

from .models import Topic                        # 注册 Topic
admin.site.register(Topic)

@apps.py

class LearningLogsConfig(AppConfig):             # APP 的设置连结
    name = 'learning_logs'

@models.py

from django.db import models # 导入 django models

@urls.py

from django.urls import path
from . import views
urlpatterns = [                                  # 连结自定义的回应函数到解析URL
    path('', views.Topic, name='index')
]

执行

django-admin startproject new_project_name        # 建立计划目录
manage.py runserver 指定的IP:指定的Port            # 起动服务器
http://127.0.0.1:8000/ 或 http://localhost:8000/  # 访问网址, 加 admin 进入管理者
manage.py startapp new_APP_name                   # 建立新APP
manage.py makemigrations                          # 诉 Django 模型有所变动,这会建立一个迁移(migration)档案
manage.py migrate                                 # 完成迁移
3年前 评论
compass (楼主) 3年前
讨论数量: 8

有个问题就是,这个目录有init.py,当为什么编译器没有把它当成一个package?导入会出现 ImportError: attempted relative import with no known parent package 的报错

3年前 评论

Requested setting INSTALLED_APPS, but settings are not configured. 这个报错是因为在settings的INSTALLED_APPS列表里没有写这个模块吧

3年前 评论
compass (楼主) 3年前
Jason990420

我也建了一个,没啥问题啊〜〜

d:\test>django-admin startproject learning_log

d:\test>cd learning_log

d:\test\learning_log>manage.py startapp learning_logs

d:\test\learning_log>cd learning_logs

d:\test\learning_log\learning_logs>copy con models.py
class Topic(models.Model):
您要覆写 models.py 吗? (Yes/No/All): y
    '''用户学习的主题'''
    text = models.CharField(max_length = 200)
    date_added = models.DateTimeField(auto_now_add = True)
    def __str__(self):
        '''返回模型的字符串表示'''
        return self.text^Z
复制了 1 个档案。

d:\test\learning_log\learning_logs>copy con views.py
from django.shortcuts import render
您要覆写 views.py 吗? (Yes/No/All): y
# from sys import path
# path.append(r'D:/pycharm/Web应用程序/Learning Log/learning_logs')
from .models import Topic^Z
复制了 1 个档案。

d:\test\learning_log\learning_logs>cd ..

d:\test\learning_log>manage.py makemigrations
No changes detected

d:\test\learning_log>manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying sessions.0001_initial... OK

d:\test\learning_log>manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
June 09, 2020 - 15:40:19
Django version 3.0.6, using settings 'learning_log.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
[09/Jun/2020 15:40:33] "GET / HTTP/1.1" 200 16351

file

127.0.0.1:8000/

file

3年前 评论
compass (楼主) 3年前

我将整个项目删除之后重新来过。在models.py编写了模型,并且完成了数据库迁移文件应用,也在settings.py中进行了模型激活。但是在admin.py里面注册模型后运行又出现关于导入模块报错,实在不理解为什么导入总是出错,难道是配置有什么问题吗 :flushed:

file

file

file

3年前 评论
Jason990420

为什么你要单独跑 admin.py ? 它只是注册新加的模型.

在哪里有文件说明你要这么作 ?

3年前 评论
compass (楼主) 3年前
Jason990420

这些都不用你作, 在各个文件中能参考到你的设置就行.

有些地方我改了, 有些地方我加了, 也许有些新建文件, 不记得作了些什么.

反正不只 models.py 及 views.py

下载这个文件, 再自己比对一下吧. 晚點我再提一下改了什麼

learning_log.rar

3年前 评论
Jason990420

In learning_log:

@settings.py

INSTALLED_APPS = [
    'learning_logs.apps.LearningLogsConfig',     # 新增行, 才能连结到 learning_logs
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

In learning_logs:

@admin.py

from .models import Topic                        # 注册 Topic
admin.site.register(Topic)

@apps.py

class LearningLogsConfig(AppConfig):             # APP 的设置连结
    name = 'learning_logs'

@models.py

from django.db import models # 导入 django models

@urls.py

from django.urls import path
from . import views
urlpatterns = [                                  # 连结自定义的回应函数到解析URL
    path('', views.Topic, name='index')
]

执行

django-admin startproject new_project_name        # 建立计划目录
manage.py runserver 指定的IP:指定的Port            # 起动服务器
http://127.0.0.1:8000/ 或 http://localhost:8000/  # 访问网址, 加 admin 进入管理者
manage.py startapp new_APP_name                   # 建立新APP
manage.py makemigrations                          # 诉 Django 模型有所变动,这会建立一个迁移(migration)档案
manage.py migrate                                 # 完成迁移
3年前 评论
compass (楼主) 3年前

前辈,问题解决了。之前总是去跑单个文件然后莫名其妙出现报错,我将之前做的一些修改改了回来,好好理解了“在各个文件中能参考到你的设置就行”这句话,直接执行runserver就OK了,不必纠结报错。感谢指点!

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!