2012-03-26 9 views
17

大規模なDjangoプロジェクトを新しくリリースされたDjango 1.4にアップグレードしようとしています。python manage.py testを実行する際にいくつか問題があります。'admin'は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)), 

Iグーグル特にこのエラーは、私が見つけることができるすべてがすべてで、この問題に関連し、古いスキームを使用して管理URLをインポートする人々、そして何である

私はINSTALLED_APPSから1つずつアプリケーションを削除しようとしましたが、認証テストは合格しません。また、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テストは通常​​の状況下では失敗しません。あなたはすべてを慎重に検査する必要があります。私も同様のエラーがあり、私のurlパターンの不均衡な括弧に関連することが判明しました。 –

+0

何が起こったのか分かりましたか?私は正直にこのようなものに歩いていて、何が起こったのか分からない。私はちょうど私の自分のアプリのディレクトリに管理テンプレートのものを移動していなくて終わった。 – stormlifter

+1

私はtest_middleware_disabledのようないくつかのdjango 1.5テストで同じエラーがあります。私は受け入れられた答えに示唆されているようにTEMPLATE_LOADERSの順序を逆転しようとしましたが、私のアプリケーションテンプレートのディレクトリ(Amirの提案通り)から管理用テンプレートを削除しましたが、まだエラーが出ます。 –

答えて

9

これは、設定ファイルのTEMPLATE_LOADERSキーの順序によるものです。

は、私は次のようでした:管理者URLを逆転させる際に何らかの形で、エラーの原因となった、

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

。 2つのラウンドを切り替えて問題を解決しました。空のDjango 1.4プロジェクトでは再現できないので、これがどうなるか知りたいです。

となりましたが、settings.AUTH_PROFILE_MODULEの場合はAttributeErrorでした。これは、リリース日のhereに提出されたDjango 1.4のバグです。

+0

AttributeErrorバグの回避策はありますか? – acjay

+0

まだ見つけられていませんが、できることがあるかどうかを知りたいです。私は、TDDまたはContinuous Integrationをテストコードとして使用することを妨げるため、この問題にあまり優先度が低いことに不満を抱いていました。 特にこのテストをスキップするカスタムテストランナーを作成しようとしましたが、動作させることができませんでした。私が知っている唯一の解決策(理想的ではない)は、自分のアプリをテストすることです。 'django-nose'を使うと、これはデフォルトの動作です。 –

2

app_directoriesテンプレートローダーは、INSTALLED_APPSテンプレートディレクトリからテンプレートを読み込みますが、ファイルシステムローダーはTEMPLATE_DIRS設定で設定されたテンプレートディレクトリからテンプレートを読み込みます。

これらの2つを切り替えると大きな違いがあります。これは、アプリケーションにカスタムテンプレートがあると、app_directoriesが一番上にあると読み込まれないためです。ファイルシステムローダーが一番上にある場合、djangoはtemplates_directory内のテンプレートを最初に探してから、installed_appsからデフォルトのものをロードします。

空のDjangoプロジェクトで再現できないのはそのためです。適切な場所でテンプレートを探します。

+3

この質問は、テンプレートではなくURLconfに関するエラーです。だからこそ私は(そしてまだまだ)解決策に困惑していた。 –

14

短い回答:あなたのアプリのテンプレートディレクトリのDjangoの以前のバージョンからコピーされたDjango管理用テンプレートファイルのコピーがあります。その後Djangoをアップグレードしましたが、それらのローカルテンプレートを更新(再コピー)しませんでした。 。

ロング回答:この問題の主な原因は、Djangoの管理テンプレートファイルの古いバージョン(ジャンゴ自体がインストールされている場所に設置され、通常のpythonのsite-packagesdist-packagesディレクトリ)を使用しています。

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 1.5 release notesからでなければならないでURLテンプレートタグについてはDjango 1.5での後方互換性のない変更があり、あなたのアプリのテンプレートフォルダは、以前のバージョンのDjangoから作られています。これは通常、デフォルトの管理用テンプレートを上書きするために行われます。後方互換性のない変更があるため、これらの古いテンプレートファイルは新しいDjango環境に読み込まれず、奇妙なエラーが発生する可能性があります:NoReverseMatch: u'admin' is not a registered namespace

TEMPLATE_LOADERSの順番を変更すると、デフォルトのテンプレートファイルの方がローカル管理テンプレートの変更が無視されます(デフォルトのDjangoテンプレートは完全パスでfilesystem.Loaderでロードされるため)。変更が必要な場合(通常はそうです)、新しいDjangoインストールテンプレートからローカル管理用テンプレートファイルを更新し、変更内容をそれらに再適用する必要があります。

注1:同様の状況は、ローカル管理用テンプレートがDjangoインストールのデフォルトよりも新しい場合です。これはあなたの場合のようです。同様に、管理テンプレートのすべてのコピーを更新するほうがよい場合があります。

注2:このようなエラーが発生する別の可能性は、virtualenvを使用する場合です。たとえば、virtualenvでプロジェクトを実行しているのに、Django管理用テンプレートのTEMPLATE_DIRSエントリがグローバルなPythonインストールにある場合、このエラーが発生する可能性があります。

+1

驚くべき答え!私はあなたがそれに値するので、私はこれを何度もアップヴォートすることができたらいいと思う。 –

5

urls.pyファイルのincludeメソッド内でnamespace = "admin"を追加してみてください。

例:URL(R '^管理/'、( "someUrlpattern"、名前空間= "管理者")を含む)

0

マイsolutuionは、最新cersionにジャンゴをアップグレードしました: インストールPIP --upgradeジャンゴ== 1.6.1 これより前に、インストールされているバージョンを確認してください: pip freeze | grep Django - リリース版に古いバージョンがあることがわかったので、この問題は解決されました!

0

私のURL confには2つのlogoutのURLが定義されているため、同様のエラーメッセージが表示されました。

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'), 
] 
関連する問題