2016-08-21 1 views
0

次の質問に対する回答が見つかりませんでした。調べるのに数時間かかりました。私はそれを解決する私のアプローチと答えを追加します。Djangoフォームがクリーンではない<fieldname>(この場合はclean_email)

私はThis personからYouTubeチュートリアルに従っています。何らかの理由で同じコードを入力していて、すべての文字をチェックしました。まだ何らかの理由で私のクリーニング機能が呼び出されていません。おそらくrelated questionが類似したものを示して以来、おそらく単純なものでしょう。それはおそらく私が間違って取得するフレームワークのものですが、私はそれが何であるか分からないでしょう。

ここに関連コードがあります。しばらくの間、print文を使用して、その質問を読んだ後

forms.py(his Githubから完全なコピー/ペースト)

from django import forms 

from .models import SignUp 

class ContactForm(forms.Form): 
    full_name = forms.CharField(required=False) 
    email = forms.EmailField() 
    message = forms.CharField() 


class SignUpForm(forms.ModelForm): 
    class Meta: 
     model = SignUp 
     fields = ['full_name', 'email'] 
     ### exclude = ['full_name'] 

    def clean_email(self): 
     email = self.cleaned_data.get('email') 
     email_base, provider = email.split("@") 
     domain, extension = provider.split('.') 
     # if not domain == 'USC': 
     # raise forms.ValidationError("Please make sure you use your USC email.") 
     if not extension == "edu": 
      raise forms.ValidationError("Please use a valid .EDU email address") 
     return email 

    # Final part is ommited, since it's not relevant. 

(チュートリアルからオーバー型付け)admin.py

from django.contrib import admin 

# Register your models here. 
from .models import SignUp 
from .forms import SignUpForm 

class SignUpAdmin(admin.ModelAdmin): 
    list_display = ['__unicode__', 'timestamp', 'updated'] 

    class Meta: 
     model = SignUp 
     form = SignUpForm 

admin.site.register(SignUp, SignUpAdmin) 

答えて

0

私の問題を解決できなかったので、私はDjangoのソース(most similar question I could findに触発されたアイディア)を調べることにしました。

次に、私はDjangoが私のカスタマイズされた機能(tutorial + SO answerのおかげで)をどのように扱っているのか知りたかったので、ソースをデバッグすることにしました。ソースでは、カスタマイズされた関数がreturn super(EmailField, self).clean(value)(line 585、django/forms/fields.py、Django 1.8)の周りに呼び出されていました。私がコードをステップ実行していたとき、私は重要な行if hasattr(self, 'clean_%s' % name):(行409、django/forms/forms.py、Django 1.8)を見つけました。私はnameの値が"email"であることを確認しました。しかし、if文はFalse(Pdb) p hasattr(self, 'clean_%s' % name))と評価されます。私は、関数名が登録されていないことを知るまで(なぜなら、(Pdb)pp dir(self))、理由を理解できませんでした。

私は、全体のソースコードリポジトリおよびクロスチェックのすべてのファイルを見てみることにしましたし、私は

class Meta: 
    model = SignUp 
    form = SignUpForm 

form/SignUpFormがメタクラス内にネストされたことを意味していることが分かりました。最初はそれほど心配していませんでしたが、メインクラス(SignUpAdmin)に滞在している間は、徐々にMetaクラスの外にあるはずです。

したがって、form = SignUpFormは、1つのタブバックと同じである必要があります。私にとっては、Djangoの初心者としては、メタクラスが両方のタイプのデータ(モデルとフォーム)をカプセル化することになっていると思っていたので、それはまだまだ私を困惑させます。どうやら、それは私が間違っているものではありません。

+0

いいえ。あなたはMetaクラスを削除する必要はありませんでした。重要なことは、clean_emailメソッドがMetaクラスの中に入れ子になっていることを暗示しているのに対し、Metaクラスの外側ではあるがメインフォームクラス内にあるはずです。 –

+0

はい、入れ子になっているのは私が使用すべき単語グループです。ありがとう:) –

関連する問題