Python 在Django窗体上引发ValidationError时出现问题
我试图验证提交的URL在数据库中是否不存在 Form类的相关部分如下所示:Python 在Django窗体上引发ValidationError时出现问题,python,django,django-forms,cleaned-data,Python,Django,Django Forms,Cleaned Data,我试图验证提交的URL在数据库中是否不存在 Form类的相关部分如下所示: from django.contrib.sites.models import Site class SignUpForm(forms.Form): # ... Other fields ... url = forms.URLField(label='URL for new site, eg: example.com') def clean_url(self): url = se
from django.contrib.sites.models import Site
class SignUpForm(forms.Form):
# ... Other fields ...
url = forms.URLField(label='URL for new site, eg: example.com')
def clean_url(self):
url = self.cleaned_data['url']
try:
a = Site.objects.get(domain=url)
except Site.DoesNotExist:
return url
else:
raise forms.ValidationError("That URL is already in the database. Please submit a unique URL.")
def clean(self):
# Other form cleaning stuff. I don't *think* this is causing the grief
问题是,无论我提交什么值,我都无法提出ValidationError
。如果我在clean\u url()
方法中执行类似操作:
if Site.objects.get(domain=url):
raise forms.ValidationError("That URL is already in the database. Please submit a unique URL.")
然后我得到一个
DoesNotExist
错误,即使对于数据库中已经存在的URL也是如此。有什么想法吗?我是这样做的。它稍微简单一点
try:
a = Site.objects.get(domain=url)
raise forms.ValidationError("That URL is already in the database. Please submit a unique URL.")
except Site.DoesNotExist:
pass
return url
我认为,您可以返回“”并填充错误
msg = u"That URL is already in the database. Please submit a unique URL."
self._errors["url"]=ErrorList([msg])
return ''
或
IRC的django频道把我救在这里。问题是URLField.clean()做了两件我没有预料到的事情:
cleaned_data['url']
期望得到类似example.com
的东西,并且实际得到了http://example.com/
。可以这么说,将我的clean\u url()
方法更改为以下工作方式:
def clean_url(self):
url = self.cleaned_data['url']
bits = urlparse(url)
dom = bits[1]
try:
site=Site.objects.get(domain__iexact=dom)
except Site.DoesNotExist:
return dom
raise forms.ValidationError(u'That domain is already taken. Please choose another')
我之所以登录,是因为我通过谷歌发现了类似的问题,并想在Carl Meyers的帖子中添加一条评论,指出根据Django文档,使用self.\u错误是完全有效的:
那么,您还有其他问题。这必须奏效。您是否正在运行“manage.py testserver”,并且每次运行时都会得到一个新的空数据库?您正在运行“manage.py runserver”吗?同意。您的其他验证方法很有可能是“造成悲伤”。解决了问题-URLField.clean()在已清理的\u数据中放入的值与我预期的不同。答案如下。-1:引发ValidationError是正确的方法。手动填充self.\u错误是一种没有充分理由的黑客行为。
def clean_url(self):
url = self.cleaned_data['url']
bits = urlparse(url)
dom = bits[1]
try:
site=Site.objects.get(domain__iexact=dom)
except Site.DoesNotExist:
return dom
raise forms.ValidationError(u'That domain is already taken. Please choose another')