如何解决Django中的Python错误?

2 投票
4 回答
1696 浏览
提问于 2025-04-17 10:51

我正在学习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 个回答

0

这些错误是不是导致我看不到带有投票应用的站点管理页面更新的原因呢?

这个问题的答案就在同一页面上,链接是 https://docs.djangoproject.com/en/1.3/intro/tutorial02/#customize-the-admin-form

1

你正在使用Pydev,这个工具在导入模块的过程中增加了一些额外的复杂性。

在学习的时候,建议用一个简单的文本编辑器和命令行。等你对Python的路径和导入逻辑有了足够的理解,能够自己设置Pydev的时候,再换成更复杂的开发环境(IDE)。

2

/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中看到的完全不同时。

撰写回答