2011-09-16 79 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'] 

使用下面的模型(models.py)

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

任何建議什麼,我在這裏失蹤?如何在更新條目時防止引發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

相關問題