Проверка уникального значения с использованием djangoforms в App Engine - PullRequest
3 голосов
/ 16 сентября 2011

Я пытаюсь проверить уникальность адреса электронной почты в хранилище данных. Проблема в том, что это не позволяет мне редактировать / обновлять запись (например, если я только хочу изменить 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 Ответ

1 голос
/ 16 сентября 2011

Вы можете проверить, изменилось ли поле вашей электронной почты, прежде чем проверять, нужно ли проверять его по всем предыдущим адресам электронной почты.Ваш метод очистки будет изменен на:

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