Python 在App Engine上使用djangoforms进行唯一值验证
我正在尝试验证数据存储中电子邮件地址的唯一性。问题是,这不允许我编辑/更新条目(例如,如果我只想更改显示名称-请参阅下面的models.py) 我正在使用djangoforms提交一个表单构建(由于我已经知道数据存储条目的键,所以预先填充了一个数据存储条目): 使用POST方法提交表单后,我从数据存储中获取详细信息,并将其与提交的表单关联: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(
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']