如何解决Django中的Python错误?
我正在学习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
教程说,当我在添加了admin文件后重启服务器时,我应该能在127.0.0.1:8000的管理页面看到Poll应用,但我看到的却是这个:
我还看到:
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
这些错误是不是导致我看不到更新后的站点管理页面,里面有Polls应用?
我该如何解决这些错误呢?
4 个回答
这些错误是不是导致我看不到带有投票应用的站点管理页面更新的原因呢?
这个问题的答案就在同一页面上,链接是 https://docs.djangoproject.com/en/1.3/intro/tutorial02/#customize-the-admin-form
你正在使用Pydev,这个工具在导入模块的过程中增加了一些额外的复杂性。
在学习的时候,建议用一个简单的文本编辑器和命令行。等你对Python的路径和导入逻辑有了足够的理解,能够自己设置Pydev的时候,再换成更复杂的开发环境(IDE)。
/newProj/src/newProj/polls
和 /firstproject/firstproject
... 呜,这看起来确实是几个问题的根源。好吧,先来讲几个概念:
Python包:所有的Python应用程序都可以由包组成。简单来说,这些包就是包含一个 __init__.py
文件的文件夹。
Python如何找到包:当Python寻找包的时候,可以做两件事:
- 如果当前目录是一个包,也就是说它里面有
__init__.py
文件,Python就可以从里面的文件导入内容。 - 它可以在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中看到的完全不同时。