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

时间:2011-09-16 15:05:02

标签: python django google-app-engine validation django-forms

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

我正在使用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 个答案:

答案 0 :(得分: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']