Python 在App Engine上使用djangoforms进行唯一值验证

Python 在App Engine上使用djangoforms进行唯一值验证,python,django,google-app-engine,validation,django-forms,Python,Django,Google App Engine,Validation,Django Forms,我正在尝试验证数据存储中电子邮件地址的唯一性。问题是,这不允许我编辑/更新条目(例如,如果我只想更改显示名称-请参阅下面的models.py) 我正在使用djangoforms提交一个表单构建(由于我已经知道数据存储条目的键,所以预先填充了一个数据存储条目): 使用POST方法提交表单后,我从数据存储中获取详细信息,并将其与提交的表单关联: entry = db.get(db.Key(self.request.get('key'))) data = forms.UserForm(

我正在尝试验证数据存储中电子邮件地址的唯一性。问题是,这不允许我编辑/更新条目(例如,如果我只想更改显示名称-请参阅下面的models.py)

我正在使用djangoforms提交一个表单构建(由于我已经知道数据存储条目的键,所以预先填充了一个数据存储条目):

使用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中)进行验证:

使用以下模型(在models.py中)

有什么建议我在这里遗漏了什么?在更新条目时,如何防止引发ValidationError?请记住,我确实希望防止添加具有相同电子邮件地址的新数据存储条目


提前感谢您的帮助

您可以先检查电子邮件字段是否已更改,然后再检查是否根据以前的所有电子邮件地址对其进行验证。您的清理方法将更改为:

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']

你是一个绝对的英雄!!万分感谢!那很有效!很高兴了解self.changed_数据:)
  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()
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']