我正在尝试验证数据存储区中电子邮件地址的唯一性。问题是这不允许我编辑/更新条目(例如,如果我只想更改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?请记住,我确实希望阻止添加具有相同电子邮件地址的新数据存储条目。
提前感谢您的帮助!
答案 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']