我正在努力学习 Django 项目的教程。
我已经做到了:https://docs.djangoproject.com/en/1.3/intro/tutorial02/#s-make-the-poll-app-modifiable-in-the-admin但我在某些文件中看到错误,例如在 admin.py 文件中:
from polls.models import Poll
from django.contrib import admin
admin.site.register(Poll)
我遇到了错误
Unresolved import: Poll
模型的定义如教程中所述:
import datetime
from django.db import models
class Poll(models.Model):
question = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __unicode__(self):
return self.question
def was_published_today(self):
return self.pub_date.date() == datetime.date.today()
class Choice(models.Model):
poll = models.ForeignKey(Poll)
choice = models.CharField(max_length=200)
votes = models.IntegerField()
def __unicode__(self):
return self.choice
教程指出,当我在添加管理文件后重新启动服务器时,我应该在管理页面中看到在 127.0.0.1:8000 引用的投票应用程序,但我所看到的是:
我也看到了
Unresolved import: Poll admin.py /newProj/src/newProj/polls line 0 PyDev Problem
Unresolved import: settings manage.py /firstproject/firstproject line 10 PyDev Problem
Unresolved import: settings manage.py /newProj/src/newProj line 10 PyDev
这些错误是我看不到使用投票应用程序更新的站点管理页面的原因吗?
如何解决这些错误?
请您参考如下方法:
/newProj/src/newProj/polls 和 /firstproject/firstproject...哎呀,这看起来像是一些问题的根源。 OK,几个概念:
Python 包:所有 Python 应用程序都可以由包组成。这些基本上只是包含 __init__.py 文件的目录。
python 如何查找包:嗯,python 在查找包时可以做以下两件事之一:
- 如果当前目录是一个包,即包含
__init__.py,它可以从其中的文件导入。 - 它可以搜索 python 路径(
PYTHONPATH环境变量,或sys.path- 同样的东西),然后向下搜索子包。
django 项目的布局方式:默认的 django 项目如下所示:
project_folder/
__init__.py
settings.py # config
urls.py # url config
polls/
__init__.py # makes polls a package
models.py # models
admin.py # admin
views.py # app views
forms.py # per app forms
urls.py # per app urls
在此布局中,当您runserver 时,您的admin.py 有两种可能性:
from models import Poll- 这行得通是因为您仍在您的包裹范围内。from polls.models import Poll- 之所以有效,是因为polls是一个包,而您运行runserver的父级包也是如此。
尽管很诱人,但不要将 project_folder 用作包。一旦您重命名目录(例如,在部署期间),它就会破坏代码。
所以,考虑到所有这些:
- 验证您的
__init__.py文件存在于正确的位置,并且您使用的目录结构类似于上面的目录结构。可能最好也在 IDE 之外进行检查 - IDE 可能……很困难。 验证您的路径正在搜索您认为的位置。当前目录应该可以正常工作;如果不是,你可以看到
import sys print sys.path将允许您查看您正在查看的位置。您可以显式添加当前目录,但您不需要这样做。
- 我不喜欢 PyDev。这里完全是个人喜好,但我发现它很难工作,超过了通常选择的编辑器 + 终端 + 文件浏览器。您也可能如此,尤其是当您发现文件浏览器中的目录结构与您认为的 IDE 中的目录结构完全不同时。
