2012-03-26 92 views
17

我試圖將相當大的Django項目升級到新發布的Django 1.4,並且在運行python manage.py test時遇到了一些問題。'管理員'不是Django 1.4中的註冊名稱空間

很多在Django 1.3中傳遞的內部測試現在都失敗了,我看起來似乎無法解決很多奇怪的消息。出現的最之一是:

NoReverseMatch: u'admin' is not a registered namespace 

這是募投django.contrib.auth測試在特定密碼更改(其中一個是test_password_change_fails_with_mismatched_passwords (django.contrib.auth.tests.views.ChangePasswordTest)奇怪的是,該命名空間是正確註冊和應用功能就好了。我在「新」的方式進口管理:

url(r'^admin/', include(admin.site.urls)), 

當我谷歌這個錯誤特別是,所有我能找到的關於這個問題,在所有的人使用舊的方案導入管理網址,並沒有什麼。

我試過從INSTALLED_APPS一個一個地移除應用程序,但auth測試根本不會通過。另外,當我從python manage.py shell加載Python解釋器並執行reverse('admin:index')時,URL解析爲/admin/而沒有錯誤。我已經詳細閱讀了代碼,並且無法看到可能會崩潰的位置。

正如我前面提到的,這不是唯一發生的錯誤。即使在我的settings.py文件中定義了AUTH_PROFILE_MODULE,我也會從test_site_profile_not_available (django.contrib.auth.tests.models.ProfileTestCase)測試中獲得AttributeError: AUTH_PROFILE_MODULE。 Django自己的測試如何失敗?

+1

有一些錯誤代碼。在正常情況下,Django測試不會失敗。你只需要仔細檢查一切。我有一個類似的錯誤,結果與我的一個urlpatterns中的不平衡括號有關。 – 2012-03-26 15:57:50

+0

你最終發現了什麼?我誠實地走進了這樣的事情,我不知道發生了什麼。我結束了不得不將管理模板的東西移動到我自己的應用程序目錄。 – stormlifter 2012-07-17 18:01:24

+1

我對於一些django 1.5測試有同樣的錯誤,比如test_middleware_disabled。我試圖扭轉TEMPLATE_LOADERS的命令,在接受答案的建議,我已經從我的應用程序的模板目錄刪除我的管理模板(由埃米爾的建議),但我仍然得到錯誤。 – 2014-02-12 22:23:54

回答

9

事實證明,這是由於我的設置文件中的TEMPLATE_LOADERS鍵的順序。

我有以下幾點:

TEMPLATE_LOADERS = (
    'django.template.loaders.app_directories.Loader', 
    'django.template.loaders.filesystem.Loader', 
) 

其中,不知何故,倒車管理URL時造成的錯誤。切換兩輪解決了問題。我很想知道這是如何發生的,因爲它在一個空白的Django 1.4項目中是不可重現的。

什麼可重複的,但是, settings.AUTH_PROFILE_MODULE。原來,這是Django 1.4中的一個bug,它在發佈日here上提交。

+0

AttributeError bug有什麼解決方法嗎? – acjay 2012-09-04 06:09:06

+0

我還沒有找到一個 - 但我很想知道是否有辦法可以完成。我對這個問題的低優先級感到沮喪,因爲它阻止了使用TDD或持續集成來測試代碼。 我試圖創建一個自定義的測試運行器,特別是會跳過這個測試,但無法正常工作。我知道的唯一解決方案是哪一個(這不太理想)是隻測試你自己的應用程序。如果你使用'django-nose',這是默認行爲。 – 2012-09-04 10:07:01

2

app_directories模板加載器從INSTALLED_APPS模板目錄中加載模板,而文件系統加載器從TEMPLATE_DIRS設置中配置的模板目錄加載它們。

切換它們兩個會產生巨大的差異,因爲如果您的應用中有自定義模板,則它將無法加載,前提是app_directories位於頂部。如果文件系統加載器位於頂部,則django會先從您的模板目錄中查找模板,然後再從installed_apps加載默認的模板。

這就是爲什麼它不能在空白的Django項目中重現。它會在正確的地方尋找模板。

+3

這個問題是關於URLconf錯誤,而不是模板。這就是爲什麼我(並且仍然)對修復感到困惑。 – 2012-06-14 14:29:38

14

簡短的回答:你從Django的早期版本複製在你的應用程序的模板目錄的Django管理模板文件的副本,那麼您升級Django的,但沒有更新(重新複製)的本地模板。

龍答:這個問題的主要原因是使用Django管理模板文件的舊版本(這是安裝位置Django的安裝,通常是python的site-packagesdist-packages目錄)。有在Django 1.5的向後兼容變更有關URL模板標籤,其中第一個參數必須是字符串,從Django 1.5 release notes

One deprecated feature worth noting is the shift to 「new-style」 url tag. Prior to Django 1.3, syntax like {% url myview %} was interpreted incorrectly (Django considered "myview" to be a literal name of a view, not a template variable named myview). Django 1.3 and above introduced the {% load url from future %} syntax to bring in the corrected behavior where myview was seen as a variable.

所以,問題是你有管理的模板文件的副本中的一個你的應用程序的模板文件夾,從早期版本的Django中複製出來。這通常是爲了覆蓋默認的管理模板而完成的。由於注意到後向不兼容的更改,這些過時的模板文件無法在較新的Django環境中加載,並導致出現奇怪的錯誤:NoReverseMatch: u'admin' is not a registered namespace

更改TEMPLATE_LOADERS條目的順序將忽略本地管理員模板修改,以支持默認模板文件(因爲默認的Django模板通過完整路徑加載filesystem.Loader)。如果需要修改(通常是這種情況),您必須從新的Django安裝模板更新您的本地管理員模板文件,並重新應用您的修改。

注1:類似的情況是,當本地管理模板比Django安裝的默認更新時,這似乎是你的情況。同樣,更好的解決方法是更新管理模板的所有副本。

注2:獲得此類錯誤的另一種可能性是使用virtualenv時。例如,如果你是一個的virtualenv但TEMPLATE_DIRS條目Django管理模板運行您的項目到全局Python安裝,你可能會得到這個錯誤。

+1

令人驚歎的答案!我希望我可以多次讚揚這個,因爲你值得擁有它。 – 2014-02-25 21:47:43

5

嘗試在urls.py文件中包括的方法中添加的命名空間=「管理員」。

例如:URL(R '^管理員/',包括( 「someUrlpattern」,命名空間= 「管理員」))

0

我solutuion是Django的升級到最新的cersion: PIP安裝--upgrade的Django == 1.6.1 在此之前,請檢查您安裝的版本: 畫中畫凍結| grep Django - 我發現在發佈服務器上有一箇舊版本,升級解決了這個問題!

0

我有一個類似的錯誤消息發生在我身上,因爲我的網址的conf不得不定義2個logout網址。

urlpatterns = [ 
    url(r'^$', TemplateView.as_view(template_name='home.html'), name='home'), 
    url(r'^api/v1/', include(router.urls)), 
    url(r'^logout/$', auth_views.logout, name='logout'), 
    url(r'^login/$', auth_views.login, {'template_name': 'login.html'}, name='login'), 
    url(r'^logout/$', auth_views.logout, {'template_name': 'logged_out.html'}, name='logout'), 
] 
相關問題