2011-09-16 7 views
3

データストア内のメールアドレスの一意性を検証しようとしています。問題は、これによりエントリを編集/更新できないということです(たとえば、display_nameのみを変更したい場合 - 下記のmodels.pyを参照してください)。App Engineでdjangoformsを使用したユニークな値の検証

私は(私はすでにデータストアエントリのキーを知っているようにあらかじめ入力データストアのエントリで)djangoformsを使用して、フォームのビルドを提出しています:

forms.UserForm(instance=db.get(db.Key(key))) 

POSTメソッドを使用してフォームを送信した後、私はデータストアから詳細を取得そして送信されたフォームでこれらを関連付ける:

entry = db.get(db.Key(self.request.get('key'))) 
    data = forms.UserForm(data=self.request.POST, instance=entry) 

    if data.is_valid(): 
     ... 
形態は、次に(forms.pyに)次のフォームクラスを使用して検証

from django import forms 
    from google.appengine.ext.db import djangoforms 
    import models 

    class UserForm(djangoforms.ModelForm): 
    class Meta: 
     model = models.AuthorizedUsers 

    def clean_email(self): 
     """Prevent duplicate email addresses.""" 
     if self.Meta.model.all().filter('email =', self.cleaned_data['email']).count(): 
     raise forms.ValidationError('Duplicate Entry: %s.' % 
            self.cleaned_data['email']) 
     return self.cleaned_data['email'] 

私はここで何を

class AuthorizedUsers(db.Model): 
     """Base model class for storing user permissions.""" 
     email = db.StringProperty() 
     display_name = db.StringProperty() 

任意の提案をしないのです(models.pyに)次のモデルを使用していますか?エントリを更新するときにValidationErrorを発生させないようにするにはどうすればよいですか?同じメールアドレスを持つ新しいデータストアエントリを追加しないようにしたいと考えています。

ご協力いただきありがとうございます。

答えて

1

メールフィールドが変更されているかどうかを確認してから、以前のメールアドレスすべてに対してメールボックスを検証するかどうかを確認できます。あなたのきれいな方法は次のように変更されます:

def clean_email(self): 
    """Prevent duplicate email addresses.""" 
    if 'email' in self.changed_data: 
     if self.Meta.model.all().filter('email =', self.cleaned_data['email']).count(): 
     raise forms.ValidationError('Duplicate Entry: %s.' % 
            self.cleaned_data['email']) 
    return self.cleaned_data['email'] 
+1

あなたは絶対的なヒーローです!感謝万円!それは完璧に働いた!偉大なself.changed_dataについて学ぶために: – reallife

+0

喜んで私は助けることができる:) – Spike

関連する問題