2016-05-10 8 views
3

に検証を追加:は、私が唯一の特定の電子メールアドレスを許可するようにジャンゴ/メザニンにおけるユーザーのサインアップフォームをカスタマイズしたいと思いますので、以下のように、私は猿パッチしようとしたDjangoのUserフォーム

# Monkey-patch Mezzanine's user email address check to allow only 
# email addresses at @example.com. 
from django.forms import ValidationError 
from django.utils.translation import ugettext 
from mezzanine.accounts.forms import ProfileForm 
from copy import deepcopy 
original_clean_email = deepcopy(ProfileForm.clean_email) 
def clean_email(self): 
    email = self.cleaned_data.get("email") 
    if not email.endswith('@example.com'): 
     raise ValidationError(
      ugettext("Please enter a valid example.com email address")) 
    return original_clean_email(self) 
ProfileForm.clean_email = clean_email 

このコードは私のmodels.pyの1つの先頭に追加されています。

私は恐ろしい

django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet. 

を取得するrunserverとき、私は

import django 
django.setup() 

を追加した場合しかし、その後、python manage.py runserverちょうど私^Cまでハングアップします。

この機能を追加するにはどうすればよいですか?

+0

なぜ、 'django.setup()'を追加することが可能だと思いましたか? Djangoをスタンドアロンスクリプトで使用する場合、 'models.py'でこれを使用するべきではありません。 – Alasdair

+1

私はそれを今知っている!私はスタンドアロンのスクリプトでそれを使って必要なモデルをセットアップしましたが、実際のDjangoプロジェクトではうまくいかないことに気づいていませんでした。 – xnx

答えて

2

ready()の方法では、Monkeypatchingを実行するアプリの設定クラスを定義して、あなたのアプリの1つ(myappを使用しています)のファイルmyapp/apps.pyを作成します。

from django.apps import AppConfig 

class MyAppConfig(AppConfig): 
    name = 'myapp' 

    def ready(self): 
     # do the imports and define clean_email here 
     ProfileForm.clean_email = clean_email 

次に、あなたのINSTALLED_APPS設定で'myapp.apps.MyAppConfig'代わりの'myapp'を使用しています。

INSTALLED_APPS = [ 
    ... 
    'myapp.apps.MyAppConfig', 
    ... 
] 

メザニンを機能させるには、メザニンをアプリ設定の上に配置する必要があります。

+0

ありがとう、Alasdair。 MyAppConfigクラス定義に 'name = 'myapp''を追加する必要があることがわかりました。あなたの答えに関連するDjangoのドキュメントやチュートリアルへのリンクを提供できますか?見つけやすいとは思わない。 – xnx

+0

私はリンクするのに最適な場所が不明です。 [django apps](https://docs.djangoproject.com/ja/1.9/ref/applications/#configuring-applications)のドキュメントが参考になるかもしれません。特に、['ready'](https://docs.djangoproject.com/ja/1.9/ref/applications/#django.apps.AppConfig.ready)メソッドは、シグナルを登録するための適切な場所であり、あなたのケースでは、必要なMonkeypatchingを行います。 – Alasdair

+0

私は 'name'が必要であることを知らなかった、私は答えを更新しました。 – Alasdair

関連する問題