Skip to main content
 首页 » 编程设计

python之如何解决 Django 中的这些 Python 错误

2024年08月30日33jpfss

我正在努力学习 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 中的目录结构完全不同时。