创建article应用后导入*引发AttributeError: module 'article.admin'无site属性
from article import *会搞崩你的Django Admin? 嘿,我来给你拆解下这个问题的根源:
你在配置文件里写的from article import *是个「全局导入」,它会把article应用下所有模块、变量、类一股脑塞进当前文件的命名空间里。刚好你的article应用里有个admin.py,这就导致article.admin模块被导入进来,直接把Django自带的django.contrib.admin那个admin对象给覆盖了!
你看报错里的admin.site.urls,本来这个admin应该是Django内置的后台站点对象(自带site属性),结果现在变成了你的article.admin模块——而你的article/admin.py里根本没定义site这个属性,可不就抛出AttributeError了嘛!
1. 别用全局导入(最靠谱的方案)
真的,在Django的配置文件(比如settings.py、urls.py)里千万别用from xxx import *,太容易搞出命名冲突了。要是你确实需要导入article里的东西,明确指定要导入的内容就行:
# 比如只导入你需要的视图或模型 from article import views, models
2. 调整导入顺序(临时救急,不推荐长期用)
如果非要保留全局导入,把Django自带的admin导入放在前面,这样它就不会被后面的from article import *覆盖了:
# 先把官方的admin导入进来 from django.contrib import admin # 再导入article的内容 from article import *
3. 给导入的模块起别名(如果确实需要用article里的admin内容)
要是你得用到article.admin里的东西,给它整个别名,别和官方的admin重名:
from article import admin as article_admin
如果你想给article应用配置后台管理,你的article/admin.py应该是这个样子的(把模型注册到Django默认的admin站点):
from django.contrib import admin from .models import Article # 把你的Article模型注册到官方的admin站点 admin.site.register(Article)
但就算你这么写了,全局导入还是会搞乱命名空间,所以还是乖乖放弃from article import *吧!
内容的提问来源于stack exchange,提问作者ewinlu

